iOS 无卡顿同时使用圆角、阴影和边框的实现
在iOS开发中,最怕看到设计稿里圆角、阴影和边框同时出现,这三兄弟简直就是性能杀手。
优化的方法百度一下有很多,虽然方法不同但是原理都一样。
分享一个我自己一直使用的方法:在一个View里只应用一种效果,然后通过组合的方式达到效果。
overrideinit(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:显示阴影,放在最底层。代码很简单,只是封装了一下阴影参数:
classShadowView:UIView{ privatevarshadowColor:UIColor? privatevarshadowOpacity:CGFloat=1 privatevarshadowOffset:CGSize=CGSize(width:0,height:3) privatevarshadowBlur:CGFloat=6 overridefunclayoutSubviews(){ super.layoutSubviews() updateShadow() } funcapplyShadow(_color:UIColor?,_offset:CGSize,_opacity:CGFloat,_blur:CGFloat){ shadowColor=color shadowOffset=offset shadowOpacity=opacity shadowBlur=blur updateShadow() } privatefuncupdateShadow(){ 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+iOS12.4.4,快速滑动无任何卡顿。
给一个测试demo大家体验一下:
Github:shadow_view_demo
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。