7

Nell'adottare il nuovo UISplitViewController Sto tentando di apportare una modifica a un comportamento predefinito che si verifica quando si utilizza la modalità UISplitViewControllerDisplayModeAutomatic.Nascondere la sovrapposizione di UISplitViewController in portrait

Quando si lavora in verticale, voglio che la sovrapposizione primaria si nasconda quando l'utente attiva una spinta sul lato dei dettagli. Per impostazione predefinita, la sovrapposizione rimane sullo schermo fino a quando l'utente tocca il lato dei dettagli.

Ho provato con il seguente con il delegato:

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

Questo mi dà il comportamento desiderato in verticale, ma questo si rompe modalità orizzontale (che voglio comportarsi come UISplitViewControllerDisplayModeAllVisible). Se hai fatto una spinta e poi ruoti il ​​dispositivo, il lato sinistro è ancora nascosto (come previsto). Non riesco a trovare una posizione appriprida da collegare per reimpostare la modalità preferita a rotazione per mostrare il lato sinistro (dal momento che le raccolte di tratti non possono essere utilizzate per dire paesaggio vs ritratto sull'iPad).

Come posso attivare manualmente un licenziamento dell'overlay?

Dupe nota:iOS 8 è cambiato UISplitViewController del tutto, in modo che tutti gli altri SO risposte precedenti al giugno '14 sono probabilmente sbagliate (e ho scavato attraverso molti di loro, solo in caso)

risposta

3

Basta inserire il vostro codice (senza return NO;) nel controller della vista principale prepareForSegue:sender: o nel metodo tableView:didSelectRowAtIndexPath:. Qui funziona perfettamente!

+0

Bella risposta semplice. Ho trovato la durata di 0,3 essere un po 'lento rispetto all'animazione quando si attiva o si esce con un colpo o un pulsante; 0,2 secondi sembra giusto. – Nick

+0

Questo funziona benissimo ma se la vista principale viene visualizzata quando il dispositivo viene ruotato in orizzontale, la vista dettagliata non viene ridimensionata in modo appropriato. – Leon

5

Ho avuto lo stesso problema come te. Lo sto facendo sulla piattaforma mono touch di Xamarin, ma penserei che il risultato sarebbe lo stesso.

Come ha detto LaborEtArs, spostare il codice nel metodo prepareForSegue:sender: del controller di visualizzazione principale. Poi basta impostare la modalità automatica dopo si imposta su nascosta:

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

Dopo facendo in questo modo, non è più la rottura modalità orizzontale.

0

Ecco la versione Swift:

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

Situato nel 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

Oltre ai consigli da LaborEtArs per fare l'animazione in prepareForSegue:sender: o tableView:didSelectRowAtIndexPath:, se la vostra applicazione ha normalmente splitViewController:preferredDisplayMode impostato su UISplitViewControllerDisplayModeAutomatic, utilizzare semplicemente il metodo animateWithDuration: con un gestore di completamento per ripristinare il displayMode dopo l'animazione:

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

L'animazione è molto importante per far sì che ciò accada. Complimenti. Tuttavia, l'inserimento di questo in 'didSelectRowAtIndexPath' provoca una strana animazione di visualizzazione tabella (indesiderabile). Inserendolo in 'prepareForSegue: sender' si ottiene un'animazione brillante. – David