Рисование прямоугольника только с двумя закругленными углами с использованием пути Безье и раскадровки в Swift 2.3

У меня есть Table View с 5 ячейками, как описано ниже. Намерение состоит в том, чтобы иметь topRoundedBorderCell с белой заливкой и только закругленными границами TopLeft и TopRight, а затем иметь возможность добавлять столько ячеек, сколько необходимо, с белой заливкой и квадратными углами для любого количества параметров, по желанию, наконец, bottomRoundedCornerCell будет иметь белая заливка только со скругленными углами BottomLeft и BottomRight. Создание иллюзии одного длинного белого ящика с закругленными углами, который соответствует всем параметрам, относящимся к одной группе. Показано ниже.

Разбивка ячеек раскадровки:

введите здесь описание изображения

Когда я запускаю приложение:

введите здесь описание изображения

Однако, как вы можете видеть на втором изображении, только граница TopLeft закруглена, остальные остаются квадратными.

Я использую метод Bezier Path roundedRect в 2 отдельных классах типа UIView, которые я назначаю соответствующему views через мой Storyboard.

Верхнее представление со скругленными границами:

class TopRectangleRoundedCornersView: UIView {

    override func awakeFromNib() {

        let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: [UIRectCorner.TopLeft , UIRectCorner.TopRight], cornerRadii: CGSize(width:10.0, height:10.0))
        let mask = CAShapeLayer()
        mask.path = path.CGPath
        self.layer.mask = mask
        self.layer.backgroundColor = UIColor.whiteColor().CGColor //white fill
    }

}

Вид с закругленными нижними границами:

class BottomRectangleRoundedCornersView: UIView {

    override func awakeFromNib() {
        let path = UIBezierPath(roundedRect: self.bounds,
                                byRoundingCorners: [UIRectCorner.BottomLeft, UIRectCorner.BottomRight], cornerRadii: CGSize(width: 10.0, height: 10.0))
        let mask = CAShapeLayer()
        mask.path = path.CGPath
        self.layer.mask = mask
        self.layer.backgroundColor = UIColor.whiteColor().CGColor //white fill
    }
}

person Jace    schedule 03.03.2017    source источник
comment
Поскольку bounds.origin всегда равен 0,0, а ваш верхний левый угол — единственный, который округляется, это заставляет меня думать, что, возможно, размер вашего представления не установлен до тех пор, пока не будет вызван awakeFromNib. Я не уверен в этом, но я бы поставил там точку останова и посмотрел, правда ли это. Вам также необходимо позвонить super.awakeFromNib()   -  person creeperspeak    schedule 04.03.2017
comment
Если эти представления изменяются (автоматически изменяются?), Вам нужно будет воссоздать путь.   -  person Gary Makin    schedule 04.03.2017
comment
да, размеры представлений автоматически изменяются, означает ли это, что я должен делать это в своем контроллере табличного представления во время рендеринга ячейки?   -  person Jace    schedule 04.03.2017
comment
Было бы лучше переопределить layoutSubviews UIView в ваших классах.   -  person Gary Makin    schedule 04.03.2017


Ответы (1)


Вам нужно настроить свой путь при изменении размера представлений. См. ответы на вопрос Есть ли событие изменения размера UIView? для хорошего совет.

Моим любимым было бы предложение добавить didSet() к свойству bounds представлений.

person Gary Makin    schedule 04.03.2017
comment
Большое спасибо! Это именно то, что мне было нужно. - person Jace; 04.03.2017
comment
class BottomRectangleRoundedCornersView: UIView { переопределить границы var: CGRect { didSet { let path = UIBezierPath (roundedRect: self.bounds, byRoundingCorners: [UIRectCorner.BottomLeft, UIRectCorner.BottomRight], angleRadii: CGSize (ширина: 10,0, высота: 10,0)) let mask = CAShapeLayer() mask.path = path.CGPath self.layer.mask = mask self.layer.backgroundColor = UIColor.whiteColor().CGColor //белая заливка } } } - person Jace; 04.03.2017
comment
как вы предложили, я переместил свой код, чтобы переопределить границы var: CGRect { didSet { // Делайте что-то здесь } } вместо использования awakeFromNib. Красиво теперь работает! - person Jace; 04.03.2017
comment
Рад быть полезным :) - person Gary Makin; 04.03.2017