我正在尝试将子视图添加到现有视图中。我基本上添加了一个子视图来模仿像这个例子的ActionSheet:
http://cocoaallocinit.com/2014/03/23/implementing-a-custom-uiactionsheet
只要我不在自定义ActionSheet上使用autolayout,此示例就可以正常工作。当我这样做时,我遇到了一些问题。我添加的子视图包含一个红色视图。这个红色视图的高度,水平和垂直空间都有限制。
我的问题是4S和5S设备的高度似乎不正确。 5S上的视图比4S更高。我预计它将成为另一种方式,因为5S比4S有更多的分数。
我使用以下代码添加子视图:
[self.view addSubview:self.customActionSheet.view];
[self.customActionSheet viewWillAppear:NO];
如果我通过推送添加视图:
[self.navigationController pushViewController:self.customActionSheet animated:YES];
然后结果就像我预期的那样。 4S完全被红色视图覆盖,5S仍然在红色视图上方有一些区域。
我在这里做错了什么?
答案 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]];