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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。