Как добавить угловой радиус для UIView - PullRequest
0 голосов
/ 15 февраля 2020

Я должен установить некоторый угловой радиус UIView, и я установил его следующим кодом:

@IBDesignable
class MyUIviewCorner: UIView {

    override func layoutSubviews() { setup() } 

    func setup() {
        let r = self.bounds.size.height / 2
        let path = UIBezierPath(roundedRect: self.bounds,
        byRoundingCorners: [.topLeft, .topRight],
        cornerRadii: CGSize(width: r, height: r))
        let mask = CAShapeLayer()
        mask.backgroundColor = UIColor.clear.cgColor
        mask.path = path.cgPath
        layer.borderWidth = 1.5
        layer.borderColor = UIColor.red.cgColor
        self.layer.mask = mask
    }
}

Но я получаю этот результат:

top corner radius

Я не понимаю, почему в верхних углах есть пробелы?

Если я задаю радиус нижнего угла, я получаю это:

bottom corner radius

Ответы [ 2 ]

0 голосов
/ 15 февраля 2020

Вы можете увидеть, почему, если вы увеличите ширину границы:

enter image description here

Кажется, все еще есть заполненный прямоугольник "сверху" скругленный прямоугольник, нарисованный созданным слоем и закрывающий закругленный угол.


Вы можете достичь того, что хотите, просто рисуя с помощью UIBezierPath s:

override func draw(_ rect: CGRect) {
    let r = self.bounds.size.height / 2
    let path = UIBezierPath(roundedRect: self.bounds,
    byRoundingCorners: [.topLeft, .topRight],
    cornerRadii: CGSize(width: r, height: r))
    path.lineWidth = 1.5
    UIColor.red.setStroke()
    path.stroke()
}
0 голосов
/ 15 февраля 2020

Вы не должны использовать маску для этого, вы можете просто использовать свойство layer.maskedCorners.

layer.cornerRadius = r
layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
...