Swift UIview常用的扩展方法、圆角(1)

圆角是 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 等等。需要根据具体情况选择合适的方法来实现圆角效果。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 扩展view,给他的子类控件添加点击方法 extensionUIView {funcaddTap(_aBlo...
    光光6阅读 457评论 0 2
  • 1、改变 UITextField 占位文字 颜色和去掉底部白框 [_userName setValue:[UICo...
    i_MT阅读 1,064评论 0 2
  • NSString *bounds = NSStringFromCGRect( view1.bounds);//求出...
    向日葵_wwx阅读 328评论 0 0
  • 1 命名 使用驼峰式给类,方法或者变量等。类命名必须大写,然后方法名和变量应该以小写字母开始。 eg 首选的 pr...
    Marc_Steven阅读 782评论 0 0
  • 父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。• 深拷贝同浅拷贝的区别:浅拷...
    JonesCxy阅读 1,053评论 1 7