Objective-C - 当我添加子视图时,我的子视图将离开底部的屏幕。帧的误解?

时间:2014-07-31 22:11:57

标签: ios objective-c uiview frame cgrect

我正在练习Objective-C,我尝试以编程方式完成所有工作。

我正在制作一个简单的视图,我添加了ViewController的视图,但是这个子视图已经离开了屏幕。 当我设置我的框架时,X和Y的位置被尊重,但其余的,没有......

以下是我的结果的屏幕截图: enter image description here

正如您所看到的......红色子视图已经离开了屏幕。

以下是我添加该子视图的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];
}

对于填充,我确实为位置xy添加了15 ...而对于帧,我通过删除填充来计算self.view的大小。 ..如你所见,它适用于width,但对于height,这是一个很大的失败。它走出屏幕。

在我的AppDelegate.h中,我设置navigationController.navigationBar.translucent = NO;,为此设置xy的位置时,它会在{{1}之后开始}。

我不明白这种高度的奇怪行为......如果有人对此有一个很好的解释请。

由于

2 个答案:

答案 0 :(得分:2)

首先,您不应该依赖self.viewviewDidLoad的值。稍后会在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)];

这里没有什么区别,但它经常会有所不同,例如如果您根据父框架计算框架的xy

答案 1 :(得分:1)

loadView方法只创建视图。在调用loadView时,没有关于最终视图框架的信息,因此无法正确放置其子视图。

更新孩子观点的正确位置'帧是viewDidLayoutSubviews

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    // update child view frame here
}

备注:您可以在代码中定义子视图的自动布局约束,当视图控制器的视图调整大小时,它们将自动应用于子视图。