ios - initWithCoder 不考虑自动布局

标签 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;
}

最佳答案

在 View 层次结构中安装 View 之前,您的 View 对象的初始化方法会触发。这不是在 View 布局上进行数学运算的地方。

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

关于ios - initWithCoder 不考虑自动布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39168282/

相关文章:

ios - 如何自定义 UITableView?

ios - CMAltitudeData 最后有一些奇怪的数据,有什么想法吗?

ios - 扩展 UnicodeScalar : Creating an init method from a Character

java - 在 Objective-C 中处理 "final"参数的适当方式

ios - 反转 UIView 及其所有 subview 的颜色

iphone - iOS:推送相同的 View Controller

ios - 如何将圆角半径添加到 UIView 周围的虚线边框

java - DAO 和域中的继承

pointers - 分配 block 指针: differences between Objective-C vs C++ classes

java - 由类声明子类引起的 StackOverflowError?