Swift中UIView同时设置圆角和背景色不生效怎么解决?
问题根因
你使用的自定义roundCorners方法存在实现或调用逻辑问题,是背景色失效的核心原因:
- 多数自定义
roundCorners会通过新增CAShapeLayer子图层绘制圆角,新增的图层会直接覆盖UIView本身的背景色 - 你分两次单独调用设置不同圆角,后一次调用生成的遮罩/图层会覆盖前一次的结果,若生成时view的
bounds尚未最终确定,遮罩尺寸错误会直接遮挡整个背景
解决方案
方案1:修改调用逻辑(最快修复)
不要分开两次设置不同圆角,一次性传入所有需要的圆角参数:
droppedView.roundCorners(corners: [.bottomLeft, .bottomRight], radius: 7) droppedView.backgroundColor = .systemGray6
方案2:用iOS11+系统原生实现(性能最优)
不需要依赖自定义扩展,直接用系统CALayer的原生属性,不会出现背景色被覆盖的问题:
droppedView.layer.cornerRadius = 7 // 对应左下角、右下角 droppedView.layer.maskedCorners = [.layerMinXMaxYCorner, .layerMaxXMaxYCorner] droppedView.backgroundColor = .systemGray6
该方案不需要开启masksToBounds,不会触发离屏渲染,性能比自定义遮罩方案高很多。
方案3:修正自定义roundCorners扩展实现
如果需要兼容iOS11以下版本,替换你现有的roundCorners扩展为以下实现,仅通过mask实现圆角,不会新增子图层覆盖背景:
extension UIView { func roundCorners(corners: UIRectCorner, radius: CGFloat) { let maskPath = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) let maskLayer = CAShapeLayer() maskLayer.frame = bounds maskLayer.path = maskPath.cgPath layer.mask = maskLayer } }
注意:该方案需要在view的bounds确定后调用(比如在viewDidLayoutSubviews生命周期方法中调用),否则生成的遮罩尺寸错误会导致显示异常。
内容的提问来源于stack exchange,提问作者Fabian Stiewe
相关产品推荐
相关产品推荐

