子视图未正确定位
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;
我想这会解决你的问题!
【讨论】:
以上是关于子视图未正确定位的主要内容,如果未能解决你的问题,请参考以下文章
UIImageView 在 UIScrollView 内未正确定位