在iOS应用中添加autolayout子视图时的高度错误

时间:2014-10-10 12:46:11

标签: ios objective-c iphone autolayout

我正在尝试将子视图添加到现有视图中。我基本上添加了一个子视图来模仿像这个例子的ActionSheet:

http://cocoaallocinit.com/2014/03/23/implementing-a-custom-uiactionsheet

只要我不在自定义ActionSheet上使用autolayout,此示例就可以正常工作。当我这样做时,我遇到了一些问题。我添加的子视图包含一个红色视图。这个红色视图的高度,水平和垂直空间都有限制。

xib

我的问题是4S和5S设备的高度似乎不正确。 5S上的视图比4S更高。我预计它将成为另一种方式,因为5S比4S有更多的分数。

Side by side

我使用以下代码添加子视图:

[self.view addSubview:self.customActionSheet.view]; [self.customActionSheet viewWillAppear:NO];

如果我通过推送添加视图:

[self.navigationController pushViewController:self.customActionSheet animated:YES];

然后结果就像我预期的那样。 4S完全被红色视图覆盖,5S仍然在红色视图上方有一些区域。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

您的视图不会根据设备屏幕自动调整大小。 [UINavigationController pushViewController: animated:]将起作用,因为导航控制器会为您设置视图的框架。快速的方法是使用当前视图设置视图的框架。

self.customActionSheet.view.frame = self.view.bounds;

不要自己调用viewWillAppear:,系统会调用它。

我的建议是使用自动布局来实现您对superview的视图。以下代码使用PureLayout:https://github.com/smileyborg/PureLayout

[self.view addSubview:self.customActionSheet.view]
[self.customActionSheet.view autoPinEdgesToSuperviewEdgesWithInsets:UIEdgeInsetsZero];

答案 1 :(得分:0)

问题是您需要向self.customActionSheet.view添加约束。

当您通过pushViewController:animated:消息加载控制器视图时,系统会添加视图所需的约束,以便填充所有屏幕空间。

相反,如果您手动添加(通过addSubview:消息),则不会自动创建自动布局约束,您需要以编程方式创建它们并将其添加到视图中。

我在这里发布了一个您可能需要的示例,以便您customActionSheet填充所有屏幕空间:

NSLayoutConstraint *left = [NSLayoutConstraint constraintWithItem:self.view
                                                                      attribute:NSLayoutAttributeLeft
                                                                      relatedBy:NSLayoutRelationEqual
                                                                         toItem:self.customActionSheet.view
                                                                      attribute:NSLayoutAttributeLeft
                                                                     multiplier:1.0
                                                                       constant:0];

NSLayoutConstraint *top = [NSLayoutConstraint constraintWithItem:self.view
                                                                      attribute:NSLayoutAttributeTop
                                                                      relatedBy:NSLayoutRelationEqual
                                                                         toItem:self.customActionSheet.view
                                                                      attribute:NSLayoutAttributeTop
                                                                     multiplier:1.0
                                                                       constant:0];

NSLayoutConstraint *bottom = [NSLayoutConstraint constraintWithItem:self.view
                                                                      attribute:NSLayoutAttributeBottom
                                                                      relatedBy:NSLayoutRelationEqual
                                                                         toItem:self.customActionSheet.view
                                                                      attribute:NSLayoutAttributeBottom
                                                                     multiplier:1.0
                                                                       constant:0];


NSLayoutConstraint *right = [NSLayoutConstraint constraintWithItem:self.view
                                                                  attribute:NSLayoutAttributeRight
                                                                  relatedBy:NSLayoutRelationEqual
                                                                     toItem:self.customActionSheet.view
                                                                  attribute:NSLayoutAttributeRight
                                                                 multiplier:1.0
                                                                   constant:0];

[self.view addSubview:self.customActionSheet.view];
[self.view addConstraints:@[left, right, top, bottom]];