Swift实现部分圆⾓
圆⾓⼀直是开发中经常遇到的问题。
为了实现部分圆⾓的效果,我去查了⼀下⽤ OC 如何实现。
可惜直接语法转换以后是不能⽤的,因为mas_maskContraints (是 Masonry 这个库的语法,感谢)⽅法在 Swift 中我并没有到。在 Stack Overflow 中的搜索结果更加感⼈:
我最终放弃了,选择了另⼀种实现:
把他⽤ Swift 的⽅式实现:
extension UIView {
/// 部分圆⾓
///
/// - Parameters:
/// - corners: 需要实现为圆⾓的⾓,可传⼊多个
/// - radii: 圆⾓半径
func corner(byRoundingCorners corners: UIRectCorner, radii: CGFloat) {
let maskPath = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radii, height: radii))
let maskLayer = CAShapeLayer()
maskLayer.frame = self.bounds
maskLayer.path = Path
self.layer.mask = maskLayer
}
}
调⽤的时候需要注意⼀点:
// 调⽤没有任何问题,将左上⾓与右上⾓设为圆⾓。
<(byRoundingCorners: [pLeft, pRight], radii: 5)swift 字符串转数组
// 编译错误
let corners = [pLeft, pRight]
<(byRoundingCorners: corners, radii: 5)
需要转换⼀下类型:
let corners: UIRectCorner = [UIRectCorner.bottomLeft, UIRectCorner.bottomRight]
// 类型可省略
let corners: UIRectCorner = [.bottomLeft,.bottomRight]
在UIBerizePath类中,我们看到的byRoundingCorners参数接收的是⼀个UIRectCorner,并⾮数组类型,所以需要做⼀步类型转换,同时设置多个圆⾓。
在性能⽅⾯,我简单做了个1000⾏圆⾓Button和Label的表格,滚动起来⼗分流畅。⽤instrument种的CoreAnimation测试,可能会产⽣离屏渲染。根据,系统圆⾓使⽤ mask 的⽅式实现的,现在⽆论硬件
性能还是优化肯定要⽐当年做的好。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论