子视图未正确定位

Posted

技术标签:

【中文标题】子视图未正确定位【英文标题】:Subview isn't positioned correctly 【发布时间】:2013-04-18 11:32:38 【问题描述】:

我正在向 UIViewController 添加一个 UIDatepicker,它是 UINavigationController 的根视图,我使用此代码将 Datepicker 定位在屏幕底部。

UIDatePicker *picker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height - 216, 320, 216)];
[self.view addSubview:picker];

这通常应该将选择器准确地放置在屏幕底部,但它是 44p 错位。导航栏的高度正好是 44p,所以我认为这是问题所在,但我不知道为什么框架高度包括导航栏的高度,当它不像子视图时。

我知道一个简单的方法是减去 44,但我正在寻找一个没有任何固定数字的解决方案。有没有办法实现它,有人可以解释一下为什么视图包含导航栏的高度吗?

【问题讨论】:

【参考方案1】:

将导航栏的半透明属性设置为YES来解决你的问题..

例如:

self.navigationControllerInstance.navigationBar.translucent = YES;

【讨论】:

如果您不希望它是半透明的但仍想在没有幻数的情况下定位怎么办?似乎是一种副作用解决方案...... @bryanmac - 如果您不想将半透明属性设置为 YES,则需要将视图控制器的视图高度设置为 960(ipad 即 1004-44 纵向模式)。 iphone也需要类似的计算。像这样,您可以处理视图框架以实现要求。但是,可以肯定的是,半透明属性是解决此问题的有效方法,而不是设置视图框架。【参考方案2】:

我认为,由于您的 UIViewController 是 UINavigationController 的根视图,因此它隐含地在其边界上包含了 navigationBar。

要以编程方式获取其框架,您可以使用:

CGRect navframe = [[self.navigationController navigationBar] frame];

【讨论】:

【参考方案3】:
UIDatePicker *picker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, self.view.bounds.size.height - 216, 320, 216)];
[self.view addSubview:picker];

试试这个!

【讨论】:

对不起,这给了我同样的结果。将导航栏设置为半透明解决了它。无论如何谢谢;)【参考方案4】:

最好不要对任何维度进行硬编码。试试这个代码:

UIDatePicker *picker = [[UIDatePicker alloc] init];
CGRect pickerFrame = CGRectMake(0, CGRectGetHeight(self.view.bounds) - CGRectGetHeight(picker.bounds), CGRectGetWidth(picker.bounds), CGRectGetHeight(picker.bounds));
[picker setFrame:pickerFrame];
[self.view addSubview:picker];

它可以工作,并且不假定日期选择器的高度始终为 216。这可能会在未来的 ios 实现中发生变化,因此最好在运行时检查大小。

【讨论】:

【参考方案5】:
self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

我想这会解决你的问题!

【讨论】:

以上是关于子视图未正确定位的主要内容,如果未能解决你的问题,请参考以下文章

CALayer 在视图中未正确定位

子视图中的 ListView 未正确刷新

UIImageView 在 UIScrollView 内未正确定位

UIButton 的 title 属性正确记录但在将按钮添加为子视图时未显示

AutoLayout正确定位按钮

辅助监视器上的视图定位不正确,主监视器上的 MainWindow