【问题标题】:UIView's frame rendering larger than frameUIView的frame渲染大于frame
【发布时间】:2015-05-14 17:26:06
【问题描述】:

我正在尝试将子视图添加到 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];

我不确定是什么导致了这个问题 - 我已经从他们的视图控制器实例化了其他视图,也通过情节提要,并且没有任何问题地设置它们的框架。

EDIT:这是从包含 UIScrollView 的视图控制器的 viewDidLoad 调用的。 screenWidth & screenHeight 是这样计算的(它们是实例变量):

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

【问题讨论】:

  • 这段代码是从什么函数调用的? screenWidth 和 screenHeight 是如何定义的?
  • 在带有scrollView的视图控制器的viewDidLoad中被调用。
  • 这可能与您的问题有关,也可能与您的问题无关,但 viewDidLoad 通常是设置屏幕/尺寸相关属性的不可靠地方,尤其是在使用自动布局的情况下。 viewDidLayoutSubviews 通常更好。
  • viewDidLayoutSubviews 为我工作,谢谢。

标签: ios objective-c uiview uiscrollview


【解决方案1】:

尝试在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;
}

【讨论】:

    猜你喜欢
    • 2013-02-11
    • 2022-10-21
    • 2014-10-03
    • 2011-10-17
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多