initWithCoder没有考虑到Autolayout

时间:2016-08-26 14:08:14

标签: ios uiview subclass

我使用以下代码子类化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;
}

1 个答案:

答案 0 :(得分:1)

在视图层次结构中安装视图之前,将触发视图对象的init方法。这不是在视图布局上进行数学运算的地方。

如果您覆盖视图的layoutSubviews方法,则可以在其中放置更新视图的代码。请注意,您应该在init中添加图层的子图层(并将其保存到属性中以便稍后查找。)然后在layoutSubviews中调用[super layoutSubviews],然后根据需要调整自定义图层。