10

我在 NIB 文件中定义了一个自定义视图,并希望在 StoryBoard 中实例化一个副本,但我遇到了自动布局问题。

在一个简单的示例中,自定义视图具有固定大小的单个标签,并且垂直和水平居中,所有这些都使用自动布局。

在此处输入图像描述

文件所有者设置为我的班级,它有一个通往顶视图的出口。在自定义视图实现中,我这样做:

- (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,将它的类设置为我的自定义类,并将其布局到我的页面上并以我的页面为中心,再次使用自动布局。

在此处输入图像描述

我的小部件的位置和大小都正确,但它的内容没有调整大小,如下图所示: 在此处输入图像描述

从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]];

但这会导致无效的布局约束。

关于如何让它发挥作用的任何想法?

干杯!

4

3 回答 3

22

需要告知通过加载 NIB 创建的视图不要将自动调整大小掩码转换为约束,即使 NIB 的内容实际上是在启用自动布局的情况下创建的。

因此,在加载 NIB 并将其顶视图添加到自定义视图之前,我需要调用:

[self.topView setTranslatesAutoresizingMaskIntoConstraints:NO];
于 2013-06-19T09:51:17.107 回答
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: 方法的原因在这里解释。我添加了 Masonry 自动布局约束,以便它与界面生成器中定义的约束一起使用。

于 2015-10-21T17:41:19.273 回答
0

禁用“使用大小类”对我有用。我不必做 mkrus 提到的事情。

于 2015-04-03T19:04:06.043 回答