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 место, чтобы зацепить его, чтобы повторно установить предпочтительный режим при повороте, чтобы показать левую сторону (так как коллекции тэгов нельзя использовать для описания пейзажа и портрета на iPad).

Как я могу вручную вызвать отклонение наложения?

Dupe Примечание:iOS8 изменил UISplitViewController полностью, поэтому все остальные SO ответы до июня '14, вероятно, не так (и я копался многие из них, просто упаковывают)

ответ

3

Просто поместите ваш код (без return NO;) в контроллерах основного вида prepareForSegue:sender: или tableView:didSelectRowAtIndexPath:. Там он отлично работает!

+0

Простой ответ. Я обнаружил, что продолжительность 0,3 будет немного медленнее по сравнению с анимацией при переключении или выводе с помощью салфетки или кнопки; Кажется, что около 0,2 секунд. – Nick

+0

Эта работа замечательная, но если главный вид отображается, когда устройство повернуто для просмотра, то подробное представление не изменяет размер соответствующим образом. – Leon

5

У меня была такая же проблема, как и вы. Я делаю это на платформе моно сенсорной платформы Xamarin, но я думаю, что результат будет таким же.

Как и в случае с лейблом LaborEtArs, переместите свой код в метод prepareForSegue:sender: контроллера главного вида. Затем просто установите режим автоматического после вы установите его скрытых:

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

После делать это таким образом, это уже не нарушая ландшафтный режим.

0

Вот Swift версия:

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' вызывает странную анимацию tableviewview detail (нежелательно). Размещение его в 'prepareForSegue: sender' приводит к блестящей анимации. – David