7

在採用新的UISplitViewController時,我試圖對使用UISplitViewControllerDisplayModeAutomatic模式時發生的默認行爲進行更改。隱藏UISplitViewController中的縱向覆蓋

當以縱向方式工作時,我希望當用戶觸發到細節端時,主要覆蓋層會隱藏。默認情況下,疊加層保持在屏幕上,直到用戶在細節端輕擊爲止。

我使用與委託以下嘗試:

- (BOOL)splitViewController:(UISplitViewController *)splitViewController showDetailViewController:(UIViewController *)vc sender:(id)sender 
{ 
    if (splitViewController.displayMode == UISplitViewControllerDisplayModePrimaryOverlay) { 
     [UIView animateWithDuration:0.3 animations:^{ 
      splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryHidden; 
     }]; 
    } 
    return NO; 
} 

這使我在肖像所期望的行爲,但是這打破橫向模式(這是我想表現得像個UISplitViewControllerDisplayModeAllVisible)。如果您已經完成推動,然後旋轉設備,則左側仍然隱藏(如預期的那樣)。我無法找到一個appriprite位置來重新設置旋轉的首選模式以顯示左側(因爲trait集合不能用於在iPad上告訴橫向vs縱向)。

如何手動觸發解除覆蓋?

杜佩注:iOS8上改變UISplitViewController完全,所以六月'14之前的所有其他SO答案都可能是錯的(我已經挖過很多人,只是櫃面)

回答

3

只需將您的代碼(沒有return NO;)在主視圖控制器prepareForSegue:sender:tableView:didSelectRowAtIndexPath:方法中。 它的功能完美!

+0

很簡單的答案。我發現0.3的持續時間比用動作或按鈕切入或切出時的動畫慢一點; 0.2秒似乎是正確的。 – Nick 2014-11-09 09:12:43

+0

這工作很好,但如果主視圖顯示設備旋轉到橫向時,詳細視圖不會適當調整大小。 – Leon 2015-07-02 19:05:18

5

我和你有同樣的問題。我在Xamarin的單點觸摸平臺上這樣做,但我會認爲結果是一樣的。

與LaborEtArs所說的一樣,將代碼移動到主視圖控制器的prepareForSegue:sender:方法。然後在將其設置爲隱藏後,將模式設置爲自動:

if (splitViewController.displayMode == UISplitViewControllerDisplayModePrimaryOverlay) { 
    splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryHidden; 
    splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAutomatic; 
} 

以這種方式完成後,它不再破壞橫向模式。

0

這裏是斯威夫特版本:

if (self.splitViewController?.displayMode == UISplitViewControllerDisplayMode.PrimaryOverlay){ 
    splitViewController?.preferredDisplayMode = UISplitViewControllerDisplayMode.PrimaryHidden 
    splitViewController?.preferredDisplayMode = UISplitViewControllerDisplayMode.Automatic 
} else { 
    println(self.splitViewController?.displayMode) 
} 

在prepareForSegue

-1
@implementation SplitProductView 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.delegate = self; 

} 


- (void)viewWillAppear:(BOOL)animated{ 
    [self resetSplit:[[UIApplication sharedApplication] statusBarOrientation]]; 

    [super viewWillAppear:animated]; 
} 

-(void)resetSplit :(UIInterfaceOrientation)toInterfaceOrientation { 

    //TODOX:iphone 
    if (isPad) 
    { 
     if(UIInterfaceOrientationIsPortrait(toInterfaceOrientation)){ 
      self.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryOverlay; 
     } 
     else{ 
      //if (self.displayMode == UISplitViewControllerDisplayModePrimaryOverlay) 
      { 
       self.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryHidden; 
       self.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible; 
       self.preferredDisplayMode = UISplitViewControllerDisplayModeAutomatic; 

      } 
     } 
    } 
} 

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    if (isPad) 
    { 
     if (!UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation])){ 
      self.preferredDisplayMode =UISplitViewControllerDisplayModePrimaryOverlay; 
     } 
    } 

    [self resetSplit:toInterfaceOrientation]; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 


- (BOOL)splitViewController:(UISplitViewController *)splitViewController 
collapseSecondaryViewController:(UIViewController *)secondaryViewController 
    ontoPrimaryViewController:(UIViewController *)primaryViewController { 
    return YES; 
} 
1

置於除了建議從LaborEtArs做你的動畫prepareForSegue:sender:tableView:didSelectRowAtIndexPath:,如果您的應用程序通常有splitViewController:preferredDisplayMode設置爲UISplitViewControllerDisplayModeAutomatic,只需使用帶有完成處理程序的animateWithDuration:方法在動畫後恢復displayMode:

if (splitViewController.displayMode == UISplitViewControllerDisplayModePrimaryOverlay) { 
    [UIView animateWithDuration:0.3 animations:^{ 
     splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryHidden; 
    } completion:^(BOOL finished){ 
     splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAutomatic; 
    }]; 
} 
+0

動畫對於實現這一目標非常重要。榮譽。但是,將其放在'didSelectRowAtIndexPath'中會導致奇怪的細節tableview動畫(不合需要)。將它放在'prepareForSegue:sender'中會產生出色的動畫效果。 – David 2016-04-17 22:45:51