角落不是UILabel和UIbutton ios swift的圆形
Posted
技术标签:
【中文标题】角落不是UILabel和UIbutton ios swift的圆形【英文标题】:Corner are not round of UILabel and UIbutton ios swift 【发布时间】:2017-08-26 12:46:04 【问题描述】:我正在尝试通过以下方法使标签和按钮的三个角变圆: rounded button
但结果是:
Image of issue
标签的某些角是圆角的,而有些则不是。类似地,它发生在按钮和宽度超出并且按钮超出 tableview 的情况下。
这是我正在使用的扩展代码:
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
【问题讨论】:
在 ios 中制作圆角真的很容易。您只需要view.layer.cornerRadius = aFloat
。无需子类化任何东西,它适用于UIView
的所有子类
Rounded rect using UIRectCorner in Swift not working的可能重复
【参考方案1】:
发生这种情况是因为bounds
这些标签和按钮在您调用rounded...()
方法时和在表格视图中显示时很可能不同。
这是因为用于创建UIBezierPath
的bounds
值与这些视图在单元格中显示后的值不同。表格视图布局一个单元格,如果您创建的 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
【讨论】:
以上是关于角落不是UILabel和UIbutton ios swift的圆形的主要内容,如果未能解决你的问题,请参考以下文章
iOS:表格单元格中的 UILabel 和 UIButton
UILabel 和 UIButton - 截断标签而不是按钮
只需要修复 UIButton 和 UILabel 的自动布局问题
Swift:如何从另一个类 X 更新 UILabel:UIButton