3

我希望我可以正確描述這種情況。在屏幕上很容易看到它,但很難用言語解釋,但我會盡我所能。UISplitViewController詳細視圖不會調整旋轉大小

我有一個固定的主視圖(UITableView中)和兩個細節視圖,這取決於什麼樣細胞的法師被觸摸一個UISplitViewController。每個Detail視圖也是一個UITableView。我已經使用Apple的MultipleDetailViews示例的Todd Bates轉換爲使用故事板作爲我的代碼的基礎(Adventures in UISplitViewController)。

我使用的故事板,所以這是在說明部分得到棘手。 Master和第一個顯示的Detail視圖導航控制器在故事板中作爲與UISplitViewController的關係進行了連接。第二個詳細導航控制器只是坐在故事板中,沒有連接。

這是問題所在。細節#1在橫向模式下處於活動狀態,細節#2通過點擊主控中的一行設置爲活動狀態。 iPad旋轉至縱向模式,導致細節#2正確調整縱向模式。通過在母版中點擊一行將Detail#1設置爲激活。細節#1的尺寸與上次以橫向模式顯示時的尺寸相同,但不會像應該顯示的那樣填充屏幕。

我的問題是,我可以告訴大家,當前未顯示調整大小本身時,方向改變的細節控制器?或者一個更好的問題是如何調整剛剛顯示的Detail視圖以調整UISplitView的Detail部分?

我希望我有足夠的細節人來幫助這個描述。

的UISplitViewControllerDelegate方法是在是應該的詳細視圖控制器那些呼叫轉發經理類實現。下面是該方法的實現:

#pragma mark - UISplitViewControllerDelegate 

/* forward the message to the current detail view 
* all detail views must implement UISplitViewControllerDelegate 
*/ 
-(void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc 
{ 
    self.masterBarButtonItem = barButtonItem; 
    self.masterPopoverController = pc; 

    barButtonItem.title = NSLocalizedString(@"Games", @"Games"); 

    [self.currentDetailController.navigationItem setLeftBarButtonItem:self.masterBarButtonItem animated:YES]; 
} 

/* forward the message to the current detail view 
* all detail views must implement UISplitViewControllerDelegate 
*/ 
-(void)splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem 
{ 
    self.masterBarButtonItem = nil; 
    self.masterPopoverController = nil; 

    [self.currentDetailController.navigationItem setLeftBarButtonItem:nil animated:YES]; 
} 

我已經實現在詳細視圖控制器中的每一個執行以下操作:

#pragma mark - Split view 

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController 
{ 
    barButtonItem.title = NSLocalizedString(@"Games", @"Games"); 
    [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES]; 
    self.masterPopoverController = popoverController; 
} 

- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem 
{ 
    // Called when the view is shown again in the split view, invalidating the button and popover controller. 
    [self.navigationItem setLeftBarButtonItem:nil animated:YES]; 
    self.masterPopoverController = nil; 
} 

問題是,無論是詳細視圖控制器都接收這些消息。我看不出他們的get反正觸發...

我怎麼看不到轉發didRotateFromInterfaceOrientation:會導致不從自身調整顯示的細節控制。從蘋果公司的文檔:

當一個基於iOS的設備的方向變化時,系統發出一個UIDeviceOrientationDidChangeNotification通知,讓所有利益相關方知道發生變化。默認情況下,UIKit框架攔截此通知並使用它自動更新界面方向。這意味着,除了少數例外,您根本不需要處理此通知。相反,您只需在視圖控制器類中實施適當的方法來響應方向更改。

窗口對象做多與改變當前方向相關的工作。但是,它與根視圖控制器一起工作,以確定是否應該發生方向更改,如果是,應該調用哪些其他方法來響應更改。如果這個控制器是一個容器,它可能依靠一個孩子來決定是否應該發生方向。

發生旋轉時,會在旋轉的各個階段調用視圖控制器的方法,以使視圖控制器有機會執行其他任務。您可以使用這些方法隱藏或顯示視圖,重新定位視圖或調整視圖大小,或者通知應用程序的其他部分關於方向更改。因爲您的自定義方法在循環操作期間被調用,所以您應該避免在那裏執行任何耗時的操作。您還應該避免用一組新視圖替換整個視圖層次結構。有更好的方法可以爲不同的方向提供獨特的視圖,例如呈現一個新的視圖控制器(如「創建一個替代景觀界面」中所述)。

回答

1

我最終解決了自己的問題。在交換Detail視圖的代碼中,我將要顯示的視圖設置爲與剛剛顯示的視圖相同的大小。我仍然有進一步的測試要做,但這個解決方案看起來像贏家。

1

到splitViewController方法類似,您應該轉發以下調用:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
    [super didRotateFromInterfaceOrientation:fromInterfaceOrientation]; 

    // Forward to detail view controller here: 

} 

到詳細信息視圖控制器是不可見的(即不是self.currentDetailController,但對方一)。

+0

我已經投票決定給你一個答案。我會盡力使這個工作,如果它的工作,我會標記爲答案。謝謝! – Moebius 2012-03-13 22:12:21

+0

謝謝!如果遇到問題,請發佈您的代碼,我很樂意提供幫助。 – lnafziger 2012-03-13 22:44:21

+0

我意識到當我看到代碼時,我應該已經在每個Detail視圖控制器中實現了UISplitViewControllerDelegate。我繼續這樣做,但Detail視圖中的協議方法未被調用。我無法發佈所有的代碼,但是還有一個Detail Manager類,它也實現了委託方法。我會在原始郵件中發佈。 – Moebius 2012-03-14 00:39:41

相關問題