iPhone7Plus与iPhone6边界宽度不一致:自定义UIView分隔线适配异常
解决iPhone Plus机型分隔线宽度不足的问题
嘿,这个问题我之前也碰到过!核心原因是你在setup()方法里直接用self.layer.frame.size.width设置分隔线宽度时,视图的最终布局还没完成——尤其是Plus机型这类屏幕尺寸特殊的设备,布局计算的时机和普通机型有差异,导致你拿到的宽度不是父视图的实际最终宽度。
给你两个靠谱的解决方案,按需选择:
方案一:用Auto Layout约束(推荐)
直接把分隔线做成UIView,用约束绑定父视图的左右边缘,这样不管屏幕怎么变,分隔线都会自动占满宽度,完全不用手动计算尺寸:
override func setup() { backgroundColor = JBCColor.greySoft // 把CALayer换成UIView,用约束更方便适配 let borderView = UIView() borderView.backgroundColor = JBCColor.darkGrey borderView.translatesAutoresizingMaskIntoConstraints = false addSubview(borderView) // 绑定约束:顶边对齐父视图,左右边缘贴合,高度1pt NSLayoutConstraint.activate([ borderView.topAnchor.constraint(equalTo: self.topAnchor), borderView.leadingAnchor.constraint(equalTo: self.leadingAnchor), borderView.trailingAnchor.constraint(equalTo: self.trailingAnchor), borderView.heightAnchor.constraint(equalToConstant: 1) ]) }
方案二:保留CALayer,在布局更新时刷新frame
如果你坚持想用CALayer,那就要在视图布局完成后重新设置它的frame,重写layoutSubviews()方法就行:
// 先把border定义成类的属性,方便在layoutSubviews里访问 private let border = CALayer() override func setup() { backgroundColor = JBCColor.greySoft border.backgroundColor = JBCColor.darkGrey.cgColor border.frame = CGRect(x: 0, y: 0, width: self.bounds.width, height: 1) self.layer.addSublayer(border) } override func layoutSubviews() { super.layoutSubviews() // 布局完成后,用bounds.width获取实际宽度(比layer.frame更准确) border.frame = CGRect(x: 0, y: 0, width: self.bounds.width, height: 1) }
为啥之前的代码不行?
setup()一般是在视图刚初始化时调用,这时候视图还没被添加到完整的视图层级,自动布局还没计算出最终的尺寸。你拿到的宽度可能是初始化时的临时值,等后续布局完成后,父视图宽度变大了,但分隔线的frame没跟着更新,就出现了Plus机型上差40pt的情况。
内容的提问来源于stack exchange,提问作者Pyae Phyoe Shein
相关产品推荐
相关产品推荐

