2015-05-14 66 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; 
}