Угол не круглый 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
}
}