UIKit中为UIButton添加图层效果后按钮图片消失该如何修复
解决方案
你的问题核心是三个错误点,按优先级修改即可修复:
- 修正系统图片的显示逻辑
你当前使用的是SF Symbols系统图标,默认渲染模式会跟随按钮的tintColor变化,如果按钮tintColor和背景色都是白色,就会出现图片“消失”的假象。可以二选一修复:
方案1:指定图标渲染模式为原始模式,不受tintColor影响
方案2:显式设置按钮的tintColor为可见色let checkedImage = UIImage(systemName: "checkmark.square")!.withRenderingMode(.alwaysOriginal) let uncheckedImage = UIImage(systemName: "square")!.withRenderingMode(.alwaysOriginal)self.tintColor = .black - 修正自定义图层的初始化与层级逻辑
你当前使用CALayer(layer: layer)初始化自定义图层是错误的,这个构造器仅用于核心动画的呈现层复制场景,普通自定义层直接初始化即可,同时你之前注释的bringSubviewToFront传参错误,应该传入按钮的内置imageView而不是图片对象:// 修正layer2初始化 layer2 = CALayer() layer2!.backgroundColor = globalColorCG_white_background layer2!.shadowColor = CGColor(gray: 0.0, alpha: 1.0) layer2!.shadowOpacity = 0.1 layer2!.shadowRadius = globalButtonRadiusShadow * 0.5 layer2!.cornerRadius = globalButtonRadiusShadow layer2!.shadowOffset = CGSize(width: 6.0, height: 8.0) layer2!.frame = layer.bounds layer.insertSublayer(layer2!, at: 0) // 在mCheckState的didSet里加上这行,保证图片在最上层 if let imageView = self.imageView { bringSubviewToFront(imageView) } - 修正自定义图层的frame适配逻辑
按钮bounds变化(比如自动布局计算完成)时,你写死的layer2 frame不会自动更新,会出现错位挡住内容的问题,重写按钮的layoutSubviews方法同步图层frame即可:override func layoutSubviews() { super.layoutSubviews() layer2?.frame = bounds }
内容的提问来源于stack exchange,提问作者Dariusz
相关产品推荐
相关产品推荐

