2015-05-14 124 views
3

我想添加一个子视图到UIScrollView。首先,我从故事板实例化视图控制器,然后将视图的框架设置为应用程序边界。当我将视图添加到UIScrollView时,它显然大于它应该是的。UIView的框架渲染大于框架

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调用的。屏幕宽度& screenHeight被计算为这样的(它们是实例变量):

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

什么功能呢这段代码是从哪里调用的? screenWidth和screenHeight是如何定义的? –

+0

使用scrollView在viewDidLoad中调用视图控制器。 – jdelman

+0

这可能与您的问题相关,也可能不相关,但viewDidLoad通常是设置屏幕/大小相关属性的不可思议的地方,尤其是在使用自动布局的情况下。 viewDidLayoutSubviews通常更好。 –

回答

6

尝试设置视图帧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; 

因为边界具有正确的位置信息,同时考虑到在这种情况下,设备的方向。

或者你也可以做到这一点,初始化MAINVIEW内viewDidLoad:方法

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

,你也可以加入这个重新配置视图框每当子视图更新后:

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