Swift 實現部分圓角

圓角一直是開發中常常遇到的問題。數組

爲了實現部分圓角的效果,我去查了一下用 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

相關文章
相關標籤/搜索