2015-02-17 24 views
6

dokumentacja iOS dla dismissViewControllerAnimated:completion: stanów:iOS 8 błąd z odrzuceniemViewControllerAnimated: zakończenie: animacja?

Jeśli prezentujesz kilka regulatorów widok z rzędu, budując w ten sposób stos prezentowanych widok kontrolerów, wywołanie tej metody na widoku kontroler niższe w stosie odrzuca jego natychmiastowe widok dziecka kontroler i wszystkie kontrolery widoku powyżej tego dziecka na stosie. Gdy to się stanie, tylko najwyższy widok zostanie odrzucony w animowanym stylu ; wszelkie kontrolery widoku pośredniego są po prostu usuwane ze stosu . Widok najwyższy jest odrzucany przy użyciu stylu modalnego przejścia , który może różnić się od stylów używanych przez inne kontrolery widoku niższy w stosie.

Znaczy to, że odwoływanie dwa kontrolery modalne widoku jednocześnie za pomocą

[[[self presentingViewController] presentingViewController] dismissViewControllerAnimated:YES completion:nil];

animacji pokazano powinien być widok z góry modalne są oddalone.

Rzeczywiście tak jest w iOS 7 i wcześniejszych wersjach, ale w iOS 8 animacja nie jest najwyższym widokiem (z mojego doświadczenia wynika, że ​​jest to drugi najwyższy widok). Czy to zachowanie jest błędem w systemie iOS 8 lub czy robię coś nie tak?

+1

Czy to znaczy górna najbardziej widok nagle znika na początku animacji? – AncAinu

+0

Jestem prawie pewien, że to błąd. Zdarza się to również, jeśli wykonujesz relację relaksacyjną, która powraca do wielu kontrolerów (jeśli dobrze pamiętam, w takim przypadku widzisz widok z góry znikający, ale także krótko, od drugiego do ostatniego kontrolera). – rdelmar

+0

Czy zgłoszenie błędu zostało zgłoszone firmie Apple? Nie wiem, jak to zrobić i jak sprawdzić. – James

Odpowiedz

3

Zgodnie z powyższym komentarzem: Widzę dokładnie ten sam problem w kontekście odprężenia odsuwania. Właśnie toke obejście w sposób opisany tutaj używając ekranu i dodać go jako podrzędny do wszystkich viewControllers pośrednimi: How to dismiss a stack of modal view controllers with animation without flashing on screen any of the presented VCs between the top and bottom?

// this in during unwind in a custom UIStoryboardSegue (that is the reason why it might look wrong with what is what: srcViewController and destViewController 
    UIViewController* aPresentedViewController = destViewController.presentedViewController; 
    while (aPresentedViewController != nil) { 
     if (aPresentedViewController == srcViewController) { 
      break; 
     } 
     UIView *anotherSrcViewCopy = [srcViewController.view snapshotViewAfterScreenUpdates: NO]; 
     anotherSrcViewCopy.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; 
     [aPresentedViewController.view addSubview:anotherSrcViewCopy]; 
     // recurse through the presentedViewController hierarchy 
     aPresentedViewController = aPresentedViewController.presentedViewController; 
    } 
1

sam problem i to samo rozwiązanie, niż @theguy. Oto moja wersja Swifta bez powtarzanie wszystkich kontrolerów widoku:

guard 
    let presentedViewController = segue.destination.presentedViewController, 
    let viewToCopy    = segue.source.view.snapshotView(afterScreenUpdates: false) 
else { return } 

viewToCopy.autoresizingMask = [.flexibleWidth, .flexibleHeight] 
presentedViewController.view.addSubview(viewToCopy)