我在NIB文件中定义了一个自定义视图,并希望在StoryBoard中实例化一个副本,但我遇到了autolayout的问题。
在一个简单的例子中,自定义视图具有固定大小的单个标签,并且在垂直和水平方向都居中,所有这些都使用自动布局。
文件所有者设置为我的班级,它有一个顶视图的插座。在自定义视图实现中,我做了:
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if(self)
{
[[NSBundle mainBundle] loadNibNamed:@"FMCompassView" owner:self options:nil];
[self addSubview:self.topView];
}
return self;
}
现在,在我的故事板中,我添加了一个UIView,将它的类设置为我的自定义类,并将其布局为大小并居中于我的页面,再次使用autolayout。
我的小部件的位置和大小正确但它的内容未调整大小,如下图所示:
我尝试在从NIB加载后添加更多约束,类似于:
UIView* subV = self.topView;
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(subV);
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[subV]|" options:NSLayoutFormatAlignAllBaseline metrics:nil views:viewsDictionary]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[subV]|" options:NSLayoutFormatAlignAllBaseline metrics:nil views:viewsDictionary]];
但这会导致无效的布局限制。
有关如何使其发挥作用的任何想法?
干杯!
答案 0 :(得分:21)
通过加载NIB创建的视图需要被告知不要将自动调整大小掩码转换为约束,即使NIB的内容实际上是在启用了autolayout的情况下创建的。
因此,在加载NIB之后,在将其顶视图添加到自定义视图之前,我需要调用:
[self.topView setTranslatesAutoresizingMaskIntoConstraints:NO];
答案 1 :(得分:1)
除了上面提到的 mkrus 之外,这就是我的initWithCoder:自定义类nib的样子:
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
NSString *className = NSStringFromClass([self class]);
self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];
[self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
[self addSubview:self.view];
[self.view mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self);
}];
}
return self;
}
解释了这个initWithCoder:方法的原因here。 我添加了Masonry自动布局约束,以便它可以使用界面构建器中定义的约束。
答案 2 :(得分:0)
禁用"使用大小类"为我工作。我没有做过mkrus提到的事情。