7

Podczas adoptowania nowego UISplitViewController próbuję zmienić domyślne zachowanie, które występuje podczas korzystania z trybu UISplitViewControllerDisplayModeAutomatic.Ukrywanie nakładki UISplitViewController w trybie portretowym

Podczas pracy portretowej chcę ukryć nakładkę główną, gdy użytkownik uruchomi wypychanie do strony szczegółów. Domyślnie nakładka pozostaje na ekranie, dopóki użytkownik nie dotknie strony szczegółowej.

Próbowałem przy użyciu następujących z delegatem:

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

To daje mi pożądanego zachowania w układzie pionowym, ale przerywa tryb krajobrazowy (którego chcę zachowywać się jak UISplitViewControllerDisplayModeAllVisible). Jeśli wykonałeś naciśnięcie, a następnie obróciłeś urządzenie, lewa strona nadal jest ukryta (zgodnie z oczekiwaniami). Nie mogę znaleźć aproksymowanego miejsca, w którym można by włączyć ponownie preferowany tryb obracania, aby pokazać lewą stronę (ponieważ kolekcje cech nie mogą być używane do odróżnienia krajobrazu od portretu na iPadzie).

Jak ręcznie uruchomić zwolnienie nakładki?

Dupe uwaga:systemów iOS 8 zmieniła UISplitViewController całkowicie, więc wszystkie inne tak odpowiedzi przed czerwcu '14 prawdopodobnie źle (a ja już wykopane przez wielu z nich, tylko okrywać)

Odpowiedz

3

Wystarczy umieścić swoje kod (bez return NO;) w metodzie kontrolerów widoku głównego prepareForSegue:sender: lub tableView:didSelectRowAtIndexPath:. To działa idealnie!

+0

Przyjemna prosta odpowiedź. Zauważyłem, że czas trwania 0,3 jest nieco powolny w porównaniu z animacją, kiedy włączasz się lub wyłączasz za pomocą machnięcia lub przycisku; 0,2 sekundy wydaje się być w porządku. – Nick

+0

To działa świetnie, ale jeśli widok główny jest wyświetlany, gdy urządzenie jest obrócone do pionu, widok szczegółów nie zmienia się odpowiednio. – Leon

5

Miałem ten sam problem co ty. Robię to na platformie mono touch Xamarin, ale myślę, że wynik będzie taki sam.

Podobnie jak w przypadku Laboratoriów, przenieś swój kod do metody prepareForSegue:sender: kontrolera widoku głównego. Następnie po prostu ustaw tryb na automatyczny po ustawieniu go w trybie ukrytym:

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

Po wykonaniu tej czynności, nie będzie już on łamał trybu poziomego.

0

Oto Swift wersja:

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

Umieszczony w 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

Oprócz rad od LaborEtArs zrobić animację w prepareForSegue:sender: lub tableView:didSelectRowAtIndexPath:, jeśli aplikacja ma normalnie splitViewController:preferredDisplayMode ustaw na UISplitViewControllerDisplayModeAutomatic, po prostu użyj metody animateWithDuration: z obsługą zakończenia, aby przywrócić displayMode po animacji:

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

Animacja jest bardzo ważna, aby tak się stało. Sława. Jednak umieszczenie tego w 'didSelectRowAtIndexPath' powoduje dziwną animację tableview (niepożądane). Umieszczenie go w 'prepareForSegue: sender' daje świetną animację. – David

Powiązane problemy