iOS 无卡顿同时使用圆角、阴影和边框的实现

 更新时间:2020年01月13日 09:06:00   作者:LayoutBoy  
这篇文章主要介绍了iOS 无卡顿同时使用圆角、阴影和边框的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在 iOS 开发中,最怕看到设计稿里圆角、阴影和边框同时出现,这三兄弟简直就是性能杀手。

优化的方法百度一下有很多,虽然方法不同但是原理都一样。

分享一个我自己一直使用的方法:在一个 View 里只应用一种效果,然后通过组合的方式达到效果。

override init(frame: CGRect) {
  super.init(frame: frame)

  imageView = UIImageView(image: UIImage(named: "img"))
  imageView.layer.cornerRadius = 14
  imageView.layer.masksToBounds = true
  backgroundView = imageView

  shadowView = ShadowView()
  shadowView.layer.cornerRadius = 20
  shadowView.applyShadow(.black, CGSize(width: 0, height: 15), 0.2, 40)
  insertSubview(shadowView, belowSubview: imageView)

  contentView.layer.cornerRadius = 14
  contentView.layer.borderWidth = 1
  contentView.layer.borderColor = UIColor.orange.cgColor
  contentView.layer.masksToBounds = true
}

层次结构:

  • contentView: 描绘边框,放在最上层。
  • imageView: 显示圆角,放在中间,用于背景图。
  • shadowView: 显示阴影,放在最底层。代码很简单,只是封装了一下阴影参数:
class ShadowView: UIView {
  private var shadowColor: UIColor?
  private var shadowOpacity: CGFloat = 1
  private var shadowOffset: CGSize = CGSize(width: 0, height: 3)
  private var shadowBlur: CGFloat = 6

  override func layoutSubviews() {
    super.layoutSubviews()

    updateShadow()
  }

  func applyShadow(_ color: UIColor?, _ offset: CGSize, _ opacity: CGFloat, _ blur: CGFloat) {
    shadowColor = color
    shadowOffset = offset
    shadowOpacity = opacity
    shadowBlur = blur

    updateShadow()
  }

  private func updateShadow() {
    layer.shadowColor = shadowColor?.cgColor
    layer.shadowOffset = shadowOffset
    layer.shadowOpacity = Float(shadowOpacity)
    layer.shadowRadius = shadowBlur * 0.5
    layer.shadowPath = UIBezierPath(roundedRect: self.bounds, cornerRadius: layer.cornerRadius).cgPath
  }
}

分开单独绘制速度很快,使用 UICollectionView 进行滚动测试,生成的 Cell 数量是 1 万个。

测试机器是 5s + iOS 12.4.4,快速滑动无任何卡顿。

给一个测试 demo 大家体验一下:

Github: shadow_view_demo

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • iOS WKWebView无法处理URL Scheme和App Store链接的问题解决

    iOS WKWebView无法处理URL Scheme和App Store链接的问题解决

    这篇文章主要给大家介绍了关于iOS WKWebView无法处理URL Scheme和App Store链接的问题解决的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03
  • IOS中MMDrawerController第三方抽屉效果的基本使用示例

    IOS中MMDrawerController第三方抽屉效果的基本使用示例

    这篇文章主要介绍了IOS中MMDrawerController第三方抽屉效果的基本使用示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-02-02
  • Objective-C计时器NSTimer学习笔记

    Objective-C计时器NSTimer学习笔记

    这篇文章主要为大家介绍了Objective-C计时器NSTimer的学习笔记,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • iOS Xcode汇编模式切换的方法介绍

    iOS Xcode汇编模式切换的方法介绍

    这篇文章主要给大家介绍了关于iOS Xcode汇编模式切换的相关资料,文中通过图文介绍的非常非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06
  • IOS代码笔记之仿电子书书架效果

    IOS代码笔记之仿电子书书架效果

    这篇文章主要为大家详细介绍了IOS仿电子书书架效果的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • iOS11上Xcode9 AppIcon 图标不显示

    iOS11上Xcode9 AppIcon 图标不显示

    升级到iOS11系统下自己的项目桌面app图标不见了,是什么原因呢,经过一番查找,终于发现问题所在,现在分享给大家
    2017-11-11
  • iOS发送短信功能的实现代码

    iOS发送短信功能的实现代码

    本篇文章主要介绍了iOS发送短信功能的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • iOS UIScrollView和控制器返回手势冲突解决方法

    iOS UIScrollView和控制器返回手势冲突解决方法

    这篇文章主要介绍了iOS UIScrollView和控制器返回手势冲突解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • iOS中定位(location manager )出现log日志的解决办法

    iOS中定位(location manager )出现log日志的解决办法

    这篇文章主要给大家介绍了关于iOS中定位(location manager )出现log日志的解决办法,文中通过示例代码将解决的办法介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧。
    2017-10-10
  • iOS使用UIScorllView实现两指缩放功能

    iOS使用UIScorllView实现两指缩放功能

    两指缩放功能不仅可以用UIPinchGestureRecognizer手势来实现,还能用UIScorllView来实现,UIScrollView可以轻松的实现最大与最小缩放值,以及滚动的效果,效果非常棒,具体实例代码大家参考下本文吧
    2017-03-03

最新评论