圆角一直是开发中常常遇到的问题。数组
为了实现部分圆角的效果,我去查了一下用 OC 如何实现。app
惋惜直接语法转换之后是不能用的,由于 mas_maskContraints
(是 Masonry 这个库的语法,感谢isaced)方法在 Swift 中我并无找到。在 Stack Overflow 中的搜索结果更加感人:ide
我最终放弃了,选择了另外一种实现:性能
把他用 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 = maskPath.cgPath self.layer.mask = maskLayer } }
调用的时候须要注意一点:优化
// 调用没有任何问题,将左上角与右上角设为圆角。 button.corner(byRoundingCorners: [UIRectCorner.topLeft, UIRectCorner.topRight], radii: 5) // 编译错误 let corners = [UIRectCorner.topLeft, UIRectCorner.topRight] button.corner(byRoundingCorners: corners, radii: 5)
须要转换一下类型:code
let corners: UIRectCorner = [UIRectCorner.bottomLeft, UIRectCorner.bottomRight] // 类型可省略 let corners: UIRectCorner = [.bottomLeft,.bottomRight]
在 UIBerizePath
类中,咱们看到的 byRoundingCorners
参数接收的是一个 UIRectCorner
,并不是数组类型,因此须要作一步类型转换,同时设置多个圆角。blog
在性能方面,我简单作了个1000行圆角Button和Label的表格,滚动起来十分流畅。用instrument种的CoreAnimation测试,可能会产生离屏渲染。根据WWDC 2014: Advanced Graphics and Animations for iOS Apps,系统圆角使用 mask 的方式实现的,如今不管硬件性能仍是优化确定要比当年作的好。ip