情景:今天试图对cell里面的一个view的左上角和右上角进行圆角处理,但是进行剪裁时cell显示的宽度就变窄了
如图
cell文件里的代码
备注:backView距离cell左右各10px
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
print(self.bounds)
print(backView.bounds)
let maskPath = UIBezierPath(roundedRect: backView.bounds, byRoundingCorners: [UIRectCorner.TopLeft, UIRectCorner.TopRight] , cornerRadii: CGSize(width: 10, height: 10))
let maskLayer = CAShapeLayer()
maskLayer.frame = backView.bounds
maskLayer.path = maskPath.CGPath
backView.layer.mask = maskLayer
}
我试图输入cell.bounds和backView.bounds,得到
->(0.0, 0.0, 320.0, 120.0)
->(0.0, 0.0, 300.0, 119.5)
问题来了,我模拟器是iphone6,cell宽度理论上是375,这里320是xib中的宽度,backview的宽度是300,剪裁后就在右边空出一片
原因:剪裁是在func awakeFromNib()初始化函数中,此时cell还是设计图时的大小,所以剪裁是在设计时的宽度下剪裁的,之后不再根据约束变化了(至于为什么不变化了,我也不清楚,如果读者知道,请告诉我,不胜感激)
解决方案:
将剪裁操作放入func layoutSubviews() 函数中
'
override func layoutSubviews() {
super.layoutSubviews()
print("hhhhhh:\(self.bounds)")
print("wwwwww\(backView.bounds)")
let maskPath = UIBezierPath(roundedRect: backView.bounds, byRoundingCorners: [UIRectCorner.TopLeft, UIRectCorner.TopRight] , cornerRadii: CGSize(width: 10, height: 10))
let maskLayer = CAShapeLayer()
maskLayer.frame = backView.bounds
maskLayer.path = maskPath.CGPath
backView.layer.mask = maskLayer
}
然而问题并没有解决
这里输出:
->hhhhhh:(0.0, 0.0, 375.0, 120.0)
->wwwwww(0.0, 0.0, 300.0, 119.5)
cell的bounds输出正确了,但backView得bounds仍然没有变化.
界面显示仍然是上图问题,滑动一会,重新布局,显示出我们想要的情况
所以不难知道,这里backView并没有立刻按照约束布局!而是我们滑动过程中进行了布局,frame发生变化,重新调用layoutSubviews()之后,界面变成想要的状态
所以,我们需要让backView立即根据约束进行布局,因而我们直接调用
backView.layoutIfNeeded()
override func layoutSubviews() {
super.layoutSubviews()
backView.layoutIfNeeded()
print("hhhhhh:\(self.bounds)")
print("wwwwww\(backView.bounds)")
let maskPath = UIBezierPath(roundedRect: backView.bounds, byRoundingCorners: [UIRectCorner.TopLeft, UIRectCorner.TopRight] , cornerRadii: CGSize(width: 10, height: 10))
let maskLayer = CAShapeLayer()
maskLayer.frame = backView.bounds
maskLayer.path = maskPath.CGPath
backView.layer.mask = maskLayer
}
至此,问题解决,结果如下图
图2.PNG
网友评论