我正在练习Objective-C,我尝试以编程方式完成所有工作。
我正在制作一个简单的视图,我添加了ViewController的视图,但是这个子视图已经离开了屏幕。 当我设置我的框架时,X和Y的位置被尊重,但其余的,没有......
以下是我的结果的屏幕截图:
正如您所看到的......红色子视图已经离开了屏幕。
以下是我添加该子视图的loadView
:
HomeViewController.m - loadView
-(void)loadView
{
self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
UIView *subview = [[UIView alloc] initWithFrame:CGRectMake(15, 15, self.view.frame.size.width - 30, self.view.frame.size.height - 30)];
[subview setBackgroundColor:[UIColor redColor]];
[self.view addSubview:subview];
}
对于填充,我确实为位置x
和y
添加了15 ...而对于帧,我通过删除填充来计算self.view
的大小。 ..如你所见,它适用于width
,但对于height
,这是一个很大的失败。它走出屏幕。
在我的AppDelegate.h
中,我设置navigationController.navigationBar.translucent = NO;
,为此设置x
和y
的位置时,它会在{{1}之后开始}。
我不明白这种高度的奇怪行为......如果有人对此有一个很好的解释请。
由于
答案 0 :(得分:2)
首先,您不应该依赖self.view
中viewDidLoad
的值。稍后会在viewWillAppear:
中将其设置为正确的值。如果在显示self.view
时自动调整子视图大小,则可以保留代码。为此,请在子视图上设置autoresizingMask
:
subview.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
(或者如果使用自动布局,则添加一组等效的约束。)
另外,我建议使用bounds
代替frame
:
UIView *subview = [[UIView alloc] initWithFrame:CGRectMake(15, 15, self.view.bounds.size.width - 30, self.view.bounds.size.height - 30)];
这里没有什么区别,但它经常会有所不同,例如如果您根据父框架计算框架的x
和y
。
答案 1 :(得分:1)
loadView
方法只创建视图。在调用loadView
时,没有关于最终视图框架的信息,因此无法正确放置其子视图。
更新孩子观点的正确位置'帧是viewDidLayoutSubviews
:
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
// update child view frame here
}
备注:您可以在代码中定义子视图的自动布局约束,当视图控制器的视图调整大小时,它们将自动应用于子视图。