UIView的框架渲染比框架大

4

我正在尝试向UIScrollView添加子视图。首先,我从故事板中实例化了视图控制器,然后将视图的框架设置为应用程序边界。当我将视图添加到UIScrollView时,它显然比它应该的要大。

CGRect mainFrame = CGRectMake(0, topButtonHeight, screenWidth, screenHeight);

feelingVC = (FeelingViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"feelingVC"];
feelingVC.delegate = self;
feelingView = feelingVC.view;
[feelingView setFrame:mainFrame];
[self.scrollView addSubview:feelingView];

我可以看出背景颜色超出了它应该的范围。在XCode的“Debug View Hierarchy”模式下也确认了这一点。但是,如果我检查视图的框架,它打印的是应该是什么,而不是实际的值。
完全以编程方式生成的相同大小的视图按预期工作:
mainView = [[UIView alloc] initWithFrame:mainFrame];
mainView.backgroundColor = [UIColor blackColor];
[self.scrollView addSubview:mainView];

我不确定是什么原因导致了这个问题 - 我已经从它们的视图控制器中实例化了其他视图,同样也通过故事板进行设置他们的框架而没有遇到任何问题。

编辑: 这是从包含UIScrollView的视图控制器的viewDidLoad中调用的。 screenWidth和screenHeight是如下计算的(它们是实例变量):

screenWidth = [UIScreen mainScreen].applicationFrame.size.width;
screenHeight = [UIScreen mainScreen].applicationFrame.size.height;

这段代码从哪个函数调用?screenWidth和screenHeight是如何定义的? - Will M.
在视图控制器的viewDidLoad中调用,与scrollView相关。 - jdelman
这可能与您的问题有关,也可能与您的问题无关,但是在viewDidLoad中设置屏幕/大小相关属性通常会出现问题,特别是如果使用自动布局。viewDidLayoutSubviews通常更好。 - Will M.
viewDidLayoutSubviews 对我有用,谢谢。 - jdelman
1个回答

8

尝试在viewWillAppear方法中设置视图框架。

viewDidLoad不是设置框架的好地方(因为它只在加载视图时调用一次),此时系统尚未正确配置UI组件。

此外,建议使用:

screenWidth = [UIScreen mainScreen].bounds.size.width;
screenHeight = [UIScreen mainScreen].bounds.size.height;

替代

screenWidth = [UIScreen mainScreen].applicationFrame.size.width;
screenHeight = [UIScreen mainScreen].applicationFrame.size.height; 

在这种情况下,由于bounds考虑了设备的方向,因此具有正确的位置信息。

或者您可以在viewDidLoad:方法中初始化mainView后执行此操作。

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    mainView.frame = [UIScreen mainScreen].bounds;
}

当子视图更新时,您还可以添加以下内容来重新配置视图框架:

- (void)viewWillLayoutSubviews { //or viewDidLayoutSubviews
    [super viewWillLayoutSubviews];
    mainView.frame = [UIScreen mainScreen].bounds;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接