如何在Swift中移除UIView上通过CALayer添加的自定义边框
Swift UIView自定义边框移除解决方案
问题原因
你当前的移除方案不生效且不推荐,核心问题有两点:
- 直接调用
layer.sublayers?.removeAll()会清除视图上所有子图层,包括你添加的其他控件、系统自带的图层,极易引发未知UI异常 - 你添加的边框CALayer没有设置唯一标识,移除时无法精准定位目标图层,要么误删其他内容,要么没删到目标边框层
优化实现方案
第一步:改造边框添加方法
给自定义边框设置唯一标识,同时添加前先移除已存在的同类型边框,避免重复添加:
func addRightBorderWithColor(color: UIColor, width: CGFloat) { // 先移除已存在的右侧边框,避免重复叠加 removeRightBorder() let border = CALayer() // 给当前边框设置唯一名称,作为后续查找的标识 border.name = "customRightBorder" border.backgroundColor = color.cgColor border.frame = CGRect( x: self.frame.size.width - width, y: 0, width: width, height: self.frame.size.height ) self.layer.addSublayer(border) }
第二步:实现精准移除方法
遍历子图层,只删除你自己添加的带标识的边框层,不影响其他图层:
func removeRightBorder() { // 过滤出所有标识为自定义右侧边框的图层,逐个移除 layer.sublayers? .filter { $0.name == "customRightBorder" } .forEach { $0.removeFromSuperlayer() } }
拓展说明
- 如果需要适配视图尺寸变化(比如屏幕旋转、视图布局更新),可以重写UIView的
layoutSubviews()方法,在里面重新调用addRightBorderWithColor方法更新边框位置 - 如果你需要支持多方向自定义边框,给不同方向的边框设置不同的name值即可,比如上边框用
customTopBorder、左边框用customLeftBorder,分别实现对应的移除逻辑即可
内容的提问来源于stack exchange,提问作者Rosanna De Vivo
相关产品推荐
相关产品推荐

