2013-12-14 74 views
2

我從父視圖控制器呈現子視圖控制器用下面的代碼:如何讓子視圖控制器在橫向顯示時瞭解其框架?

self.childVC = [[ChildVC alloc] init]; 
[self addChildViewController:self.childVC]; 
self.childVC.view.frame = self.view.bounds; 
self.childVC.alpha = 0.1; 
[self.view addSubview:self.childVC.view]; 
[UIView 
    animateWithDuration:0.3 
    delay:0.0 
    options:UIViewAnimationOptionCurveEaseInOut 
    animations:^(void) { 
     self.view.alpha = 1.0; 
    } 
    completion:^(BOOL finished) { 
     [self.childVC didMoveToParentViewController:self]; 
    } 
]; 

父視圖控制器支持所有方向。當提出的孩子,而父母是肖像方向,孩子的框架爲預期:

viewDidLoad: <UIView: 0xeb9f70; frame = (0 0; 320 568); autoresize = W+H; 
viewDidAppear: <UIView: 0xeb9f70; frame = (0 0; 320 568); autoresize = W+H; 

然而,當提交的孩子,而父母是景觀方向,孩子的框架奇怪:

viewDidLoad: <UIView: 0xeb9f70; frame = (0 0; 320 568); autoresize = W+H; 
viewDidAppear: <UIView: 0xeb9f70; frame = (0 0; 568 320); autoresize = W+H; 

在viewDidLoad中,孩子認爲它的畫面是縱向的。然後它在viewDidAppear中糾正它自己。這種零星的框架變化使得孩子的動畫看起來很不自在。當兒童以橫向方向發射時,如何使框架既正確又一致?

+0

如果你使用'initWithFrame:'怎麼辦? – nhgrif

+0

我沒有明確使用'initWithFrame'。子視圖控制器使用'loadView'的默認實現,它應該爲我生成'self.view'。 – Pwner

回答

0

viewDidLoad代表原始狀態下的視圖,當所有元素都被加載時。佈局尚未開始。如果您的視圖控制器是在故事板或筆尖中定義的,則它將具有從解碼器讀取的值。你不應該在那裏開始你的動畫,但在viewWillAppear,這應該被視爲佈局後(viewDidLayout)後調用。

0

是否實施了supportedInterfaceOrientationspreferredInterfaceOrientationForPresentation

我發現這個從ViewController Programing Guide

在iOS 5和更早版本,一個視圖控制器有時可以參與旋轉過程中,即使它不是最頂層全屏視圖控制器。這通常發生在容器視圖控制器詢問其子支持的接口方向時。在實踐中,兒童忽視父母的能力很少有用。考慮到這一點,您應該考慮在還必須支持iOS 5的應用程序中儘可能模擬iOS 6行爲:

在全屏顯示的根視圖控制器或視圖控制器中,選擇界面方向對您的用戶界面有意義。 在子控制器中,通過設計適應性視圖佈局來支持所有默認分辨率。

this您可以看到發生旋轉時發生了什麼。

希望它能幫助你弄清楚你的情況。

相關問題