initWithCoder 不考虑自动布局
initWithCoder Not Taking Into Account Autolayout
我正在使用以下代码对 UIView 进行子类化并为其添加一些边框。问题是它没有考虑自动布局约束。我想要它,以便考虑到自动布局,然后 UIView 上绘制了一个边框。任何帮助都将非常感谢。
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self) {
[self setupView];
}
return self;
}
- (void)setupView {
[self prefix_addUpperBorder:UIRectEdgeTop color:[UIColor flatWhiteColorDark] thickness:0.5];
}
- (CALayer *)prefix_addUpperBorder:(UIRectEdge)edge color:(UIColor *)color thickness:(CGFloat)thickness
{
CALayer *border = [CALayer layer];
switch (edge) {
case UIRectEdgeTop:
border.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), thickness);
break;
case UIRectEdgeBottom:
border.frame = CGRectMake(0, CGRectGetHeight(self.frame) - thickness, CGRectGetWidth(self.frame), thickness);
break;
case UIRectEdgeLeft:
border.frame = CGRectMake(0, 0, thickness, CGRectGetHeight(self.frame));
break;
case UIRectEdgeRight:
border.frame = CGRectMake(CGRectGetWidth(self.frame) - thickness, 0, thickness, CGRectGetHeight(self.frame));
break;
default:
break;
}
border.backgroundColor = color.CGColor;
[self.layer addSublayer:border];
return border;
}
视图对象的 init 方法在视图安装到视图层次结构之前触发。那不是在视图布局上进行数学运算的地方。
如果您覆盖视图的 layoutSubviews
方法,您可以将更新视图的代码放在那里。请注意,您应该在 init 中添加图层的子图层(并将其保存到 属性 以便您稍后可以找到它。)然后在 layoutSubviews
中调用 [super layoutSubviews]
然后调整您的自定义根据需要分层。
我正在使用以下代码对 UIView 进行子类化并为其添加一些边框。问题是它没有考虑自动布局约束。我想要它,以便考虑到自动布局,然后 UIView 上绘制了一个边框。任何帮助都将非常感谢。
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self) {
[self setupView];
}
return self;
}
- (void)setupView {
[self prefix_addUpperBorder:UIRectEdgeTop color:[UIColor flatWhiteColorDark] thickness:0.5];
}
- (CALayer *)prefix_addUpperBorder:(UIRectEdge)edge color:(UIColor *)color thickness:(CGFloat)thickness
{
CALayer *border = [CALayer layer];
switch (edge) {
case UIRectEdgeTop:
border.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), thickness);
break;
case UIRectEdgeBottom:
border.frame = CGRectMake(0, CGRectGetHeight(self.frame) - thickness, CGRectGetWidth(self.frame), thickness);
break;
case UIRectEdgeLeft:
border.frame = CGRectMake(0, 0, thickness, CGRectGetHeight(self.frame));
break;
case UIRectEdgeRight:
border.frame = CGRectMake(CGRectGetWidth(self.frame) - thickness, 0, thickness, CGRectGetHeight(self.frame));
break;
default:
break;
}
border.backgroundColor = color.CGColor;
[self.layer addSublayer:border];
return border;
}
视图对象的 init 方法在视图安装到视图层次结构之前触发。那不是在视图布局上进行数学运算的地方。
如果您覆盖视图的 layoutSubviews
方法,您可以将更新视图的代码放在那里。请注意,您应该在 init 中添加图层的子图层(并将其保存到 属性 以便您稍后可以找到它。)然后在 layoutSubviews
中调用 [super layoutSubviews]
然后调整您的自定义根据需要分层。