圓角一直是開發(fā)中經(jīng)常遇到的問題蝇恶。
為了實現(xiàn)部分圓角的效果,我去查了一下用 OC 如何實現(xiàn)乘客。
可惜直接語法轉(zhuǎn)換以后是不能用的狐血,因為 mas_maskContraints
(是 Masonry 這個庫的語法,感謝isaced)方法在 Swift 中我并沒有找到易核。在 Stack Overflow 中的搜索結(jié)果更加感人:
我最終放棄了匈织,選擇了另一種實現(xiàn):
把他用 Swift 的方式實現(xiàn):
extension UIView {
/// 部分圓角
///
/// - Parameters:
/// - corners: 需要實現(xiàn)為圓角的角,可傳入多個
/// - 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
}
}
調(diào)用的時候需要注意一點:
// 調(diào)用沒有任何問題牡直,將左上角與右上角設(shè)為圓角报亩。
button.corner(byRoundingCorners: [UIRectCorner.topLeft, UIRectCorner.topRight], radii: 5)
// 編譯錯誤
let corners = [UIRectCorner.topLeft, UIRectCorner.topRight]
button.corner(byRoundingCorners: corners, radii: 5)
需要轉(zhuǎn)換一下類型:
let corners: UIRectCorner = [UIRectCorner.bottomLeft, UIRectCorner.bottomRight]
// 類型可省略
let corners: UIRectCorner = [.bottomLeft,.bottomRight]
在 UIBerizePath
類中,我們看到的 byRoundingCorners
參數(shù)接收的是一個 UIRectCorner
井氢,并非數(shù)組類型弦追,所以需要做一步類型轉(zhuǎn)換,同時設(shè)置多個圓角花竞。
在性能方面劲件,我簡單做了個1000行圓角Button和Label的表格,滾動起來十分流暢约急。用instrument種的CoreAnimation測試零远,可能會產(chǎn)生離屏渲染。根據(jù)WWDC 2014: Advanced Graphics and Animations for iOS Apps厌蔽,系統(tǒng)圓角使用 mask 的方式實現(xiàn)的牵辣,現(xiàn)在無論硬件性能還是優(yōu)化肯定要比當(dāng)年做的好。