有时候,我们可能只想给 UIView 的某一个或多个角设置圆角,而不是四个角都设置。在这种情况下,我们可以使用 UIBezierPath 来指定圆角的位置。
下面是一个例子,展示了如何只给 UIView 的左上角和右下角设置圆角:
extension UIView {
func addCornerRadius(_ radius: CGFloat, corners: UIRectCorner) {
let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
let mask = CAShapeLayer()
mask.path = path.cgPath
layer.mask = mask
}
}
在上述方法中,我们使用 UIBezierPath 的 roundedRect 方法来创建一个指定角度圆角的矩形路径。方法中的 corners 参数用来指定需要圆角的角,可以是左上角、右上角、左下角、右下角的组合。例如,如果你只想要左上角和右下角有圆角,你可以这样调用方法:
myView.addCornerRadius(10, corners: [.topLeft, .bottomRight])
需要注意的是,这种方法依然需要进行视图裁剪,因此可能会比普通的圆角效果稍微消耗一些性能。
实现高性能的圆角效果需要注意以下几个方面:
1、避免离屏渲染:当使用 CALayer 的 cornerRadius 属性时,如果视图需要离屏渲染,性能会受到影响。因此,应该尽量避免使用过多的离屏渲染。
2、使用贝塞尔曲线:使用 UIBezierPath 的 addArc 方法可以创建一个具有圆角的路径,比使用 CALayer 的 cornerRadius 属性更加灵活,可以控制每个角的大小。
3、使用 CAShapeLayer:使用 CAShapeLayer 作为视图的 mask 可以避免离屏渲染,并且性能比使用 CALayer 的 cornerRadius 属性更好。
4、缓存图片:如果需要频繁地创建圆角图片,可以将图片缓存起来,避免多次生成,提高性能。
5、去掉视图背景色:如果视图的背景色为不透明色,可以将其去掉,以避免不必要的绘制,提高性能。
6、控制圆角半径:圆角半径越大,需要绘制的像素越多,性能也会受到影响。因此,应该尽量控制圆角半径的大小,避免过大。
7、控制圆角数量:圆角数量越多,需要绘制的像素越多,性能也会受到影响。因此,应该尽量减少圆角的数量。
综上所述,实现高性能的圆角效果需要综合考虑多个因素,包括绘制方式、缓存机制、视图设置等等。在实际开发中,需要根据具体情况选择最适合的实现方案,以达到最佳的性能和用户体验。