Swift代码设置UIImageView胶囊背景不生效的问题如何解决?
问题根因
你在capsuleBackground的初始化闭包中设置圆角时,视图还未完成自动布局,此时frame为CGRect.zero,view.frame.size.width/2计算结果为0,圆角配置自然不生效。另外要实现胶囊效果,用视图高度的一半作为圆角值更稳妥,不受宽度动态变化影响。
修复方案
- 先删除
capsuleBackground初始化闭包里的view.layer.cornerRadius = view.frame.size.width/2这行代码 - 重写
CategoryView的layoutSubviews方法,在布局完成后更新圆角值,完整代码如下:
class CategoryView: UIView { private let capsuleBackground: UIImageView = { let view = UIImageView() view.layer.backgroundColor = UIColor.white.cgColor view.layer.borderWidth = 1 view.layer.borderColor = COLOR_PRIMARY?.cgColor view.translatesAutoresizingMaskIntoConstraints = false view.clipsToBounds = true view.isUserInteractionEnabled = false return view }() private let textLabel: CustomUILabel = { let label = CustomUILabel(title: "Hello World") return label }() override init(frame: CGRect) { super.init(frame: frame) setup() } required init?(coder: NSCoder) { super.init(coder: coder) setup() } // 新增重写layoutSubviews方法 override func layoutSubviews() { super.layoutSubviews() // 用高度的一半计算圆角,保证胶囊效果始终生效 capsuleBackground.layer.cornerRadius = capsuleBackground.frame.height / 2 } fileprivate func setup() { addSubview(capsuleBackground) capsuleBackground.addSubview(textLabel) capsuleBackground.centerInSuperview() textLabel.edges(to: capsuleBackground, insets: TinyEdgeInsets(top: 8, left: 8, bottom: 8, right: 8)) } }
可选优化
你不需要用UIImageView作为背景载体,直接用普通UIView即可实现相同效果,性能更优。
内容的提问来源于stack exchange,提问作者Christopher
相关产品推荐
相关产品推荐

