Угол не круглый UILabel и UIbutton ios swift

Я пытаюсь закруглить три угла метки и кнопки следующим образом: закругленная кнопка

Но результат:

Изображение вопроса

некоторые углы меток закруглены, а некоторые нет. Точно так же это происходит с кнопкой и шириной, превышающей размер кнопки, выходящей из таблицы.

это код расширения, которое я использую:

extension UIButton{
    func roundedButton(){
        let maskPAth1 = UIBezierPath(roundedRect: self.bounds,
                                     byRoundingCorners: [.topLeft, .bottomLeft, .bottomRight],
                                     cornerRadii:CGSize(width:8,height:8))
        let maskLayer1 = CAShapeLayer()
        maskLayer1.frame = self.bounds
        maskLayer1.masksToBounds=true
        maskLayer1.path = maskPAth1.cgPath
        self.layer.mask = maskLayer1

    }
}

extension UILabel{
    func roundedLabel(){
        let maskPAth1 = UIBezierPath(roundedRect: self.bounds,
                                     byRoundingCorners: [.topRight,.bottomRight,.bottomLeft],
                                     cornerRadii:CGSize(width:10,height:10))
        let maskLayer1 = CAShapeLayer()
        maskLayer1.frame = self.bounds
        maskLayer1.cornerRadius=5
         maskLayer1.masksToBounds=true
        maskLayer1.path = maskPAth1.cgPath
        self.layer.mask = maskLayer1

    }
}

Я называю эти функции в

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {}

1 ответ

Решение

Это происходит потому, что bounds эти метки и кнопки, скорее всего, отличаются, когда вы звоните rounded...() методы и когда они представлены в виде таблицы.

Это потому что bounds значение, которое вы используете для создания UIBezierPath отличается от того, что эти представления имеют после того, как они представлены в ячейке. Табличное представление макетов ячейки и, если CAShapeLayer вы создаете превышение его границ, оно становится "отрезанным".

Вы должны создать подклассы UIButton а также UILabel это будет обновлять путь Безье их масок каждый раз, когда они макетируют.

class RoundedLabel: UILabel {

    override func layoutSubviews() {
        super.layoutSubviews()

        let maskPath = UIBezierPath(roundedRect: bounds,
                                    byRoundingCorners: [.topRight, .bottomRight, .bottomLeft],
                                    cornerRadii: CGSize(width: 10, height: 10))

        let maskLayer = CAShapeLayer()
        maskLayer.frame = bounds
        maskLayer.cornerRadius = 5
        maskLayer.masksToBounds = true
        maskLayer.path = maskPath.cgPath
        layer.mask = maskLayer
    }
}

В качестве дальнейшей оптимизации вы можете лениво инициализировать слой маски (то есть он будет создан при первом обращении к нему) и изменять только его кадр и путь в layoutSubviews метод.

class RoundedLabel: UILabel {

    private lazy var maskLayer: CAShapeLayer = {
        let maskLayer = CAShapeLayer()
        maskLayer.cornerRadius = 5
        maskLayer.masksToBounds = true
        self.layer.mask = maskLayer

        return maskLayer
    }()

    override func layoutSubviews() {
        super.layoutSubviews()

        let maskPath = UIBezierPath(roundedRect: bounds,
                                    byRoundingCorners: [.topRight, .bottomRight, .bottomLeft],
                                    cornerRadii: CGSize(width: 10, height: 10))

        maskLayer.path = maskPath.cgPath
        maskLayer.frame = bounds
    }
}
Другие вопросы по тегам