圓角是 iOS 開發中非常常見的需求,但是普通的圓角實現會比較消耗性能,特別是在滾動視圖中會出現卡頓的情況。下面介紹兩種高性能的圓角實現方式。
方案一:使用 CAShapeLayer
這種方法使用 CAShapeLayer 和貝塞爾曲線來實現圓角效果,具有很高的性能和可定制性。
示例代碼:
extension UIView {
func addCornerRadius(_ radius: CGFloat) {
let path = UIBezierPath(roundedRect: self.bounds, cornerRadius: radius)
let shape = CAShapeLayer()
shape.path = path.cgPath
self.layer.mask = shape
}
}
使用時,只需要調用該方法并傳入需要的圓角半徑即可:
myView.addCornerRadius(10)
方案二:使用 UIImageView 和 Core Graphics
這種方法使用 UIImageView 和 Core Graphics 來實現圓角效果,相對來說會消耗更多的內存,但是在某些情況下可能比第一種方法更高效。
extension UIView {
func addCornerRadius(_ radius: CGFloat) {
let imageView = UIImageView(frame: self.bounds)
imageView.image = self.snapshot
imageView.layer.cornerRadius = radius
imageView.layer.masksToBounds = true
self.addSubview(imageView)
}
var snapshot: UIImage? {
UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0.0)
drawHierarchy(in: bounds, afterScreenUpdates: true)
let snapshotImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return snapshotImage
}
}
該方法先創建一個 UIImageView,并將當前視圖的快照設置為其 image 屬性,然后對該 UIImageView 應用圓角效果。需要注意的是,該方法在獲取快照時會消耗一些性能和內存。
使用時,只需要調用該方法并傳入需要的圓角半徑即可:
myView.addCornerRadius(10)
這兩種方法都可以用于任何 UIView 的子類,例如 UIButton、UILabel、UIImageView 等等。需要根據具體情況選擇合適的方法來實現圓角效果。