调整超级视图的大小,使其大小等于其子视图的大小

时间:2016-08-08 20:32:09

标签: ios layout uiview nslayoutconstraint masonry-ios-osx

我已经将UIView子类化,并在其中创建了一些视图。我想在视图控制器的视图中创建此视图的实例,并且还有另一个自定义视图,该视图将放置在该视图下方。我不知道如何将第二个视图放在第一个视图下面。

当我调试帧时,我得到{{0,0},{0,0}}。我正在使用砌体进行视图布局。我尝试了this thread

的几个解决方案

我创建了一个示例项目,其中包含我尝试过的实际代码。 https://github.com/anuj-rajput/ViewSample

在此示例项目中,有2个UIViewPhoneVerificationTopViewPhoneVerificationPhoneNumberView的子类以及一个视图控制器PhoneVerificationViewController,它们可以从这两个视图中创建对象。我需要完美地对它们进行排序,使它们完全垂直对齐(PhoneNumberView低于TopView)。

我做错了吗?有没有一种正确的方法可以将UIView子类化,然后在控制器中引用它?

这就是视图的样子

Screenshot

1 个答案:

答案 0 :(得分:1)

当您使用AutoLayout时,如果希望父视图根据I'ts子类调整大小,则需要知道内容的大小。

最顶层的视图必须有一个约束到父视图的顶部。 最底层的视图必须对父视图的底部有一个约束。

目前,您的观点非常不包含子类。

如果你试试,例如将“topView”的背景颜色设置为红色, 你会注意到,它并没有改变我的颜色。那是因为我的大小是0。 我没有包装内容。 如果你将“clipToBound”设置为YES,你也不会看到它的子类。

要修复它,请从底部视图添加底部约束到父视图:

[self.subtitleTextLabel mas_makeConstraints:^(MASConstraintMaker *make) {
            make.centerX.equalTo(self.titleTextLabel);
            make.width.equalTo(self.mas_width).multipliedBy(0.7);
            make.top.equalTo(self.titleTextLabel.mas_bottom).with.offset(10.f);
            make.bottom.equalTo(self.mas_bottom); //This line is added
        }];


[self.sendButton mas_makeConstraints:^(MASConstraintMaker *make) {
            make.centerX.equalTo(self);
            make.width.equalTo(self).multipliedBy(0.4);
            make.height.equalTo(@40);
            make.top.equalTo(self.phoneNumberTextView.mas_bottom).with.offset(30.f);
            make.bottom.equalTo(self.mas_bottom); // This line is added
        }];