Metody rotacji przestarzałe, odpowiednik „didRotateFromInterfaceOrientation”?


137

Próbuję zaimplementować nową viewWillTransitionToSizemetodę, która została wprowadzona w iOS 8 (wszystkie inne metody rotacji zostały wycofane). Chciałbym wiedzieć, jaki didRotateFromInterfaceOrientationjest teraz odpowiednik, ponieważ jest wiele zadań porządkujących, które musimy wykonać i nie widzę bloku, do którego możemy przypisać UIViewControllerTransitionCoordinator, aby został wywołany podczas `` przejścia '' do nowego rozmiar kończy. Dzięki.

Odpowiedzi:


255

OK, znalazłem, po prostu musisz użyć animateAlongsideTransition:completion:metody na przekazanym UIViewControllerTransitionCoordinator.

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{   
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context)
    {
        UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
        // do whatever
    } completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
    { 

    }];

    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}

Czy ta metoda będzie wywoływać za każdym razem, gdy będziemy obracać, jak didRotateFromInterfaceOrientation ?. Czy możesz podzielić się ze mną zastosowaną metodą. Dziękuję
— ask123

2
Tak, to będzie. Oto, co robię: - (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) { UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; // do whatever } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) { }]; [super viewWillTransitionToSize: size withTransitionCoordinator: coordinator]; }
— dziwne

1
Dzięki - dodam szybką wersję jako odpowiedź, aby zaoszczędzić ludziom trochę czasu
— DogCoffee

3
statusbarorientation jest przestarzała w iOS 9. Co jeszcze jest tą opcją?
— Deepak Sharma,

1
@DeepakSharma Trochę spóźniłem się na imprezę, ale możesz użyć [UIDevice currentDevice].orientation. Możesz również podłączyć to do UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)lub UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation). Mam nadzieję że to pomoże!
— Jeff

70

Szybka wersja odpowiedzi dziwna

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

    coordinator.animateAlongsideTransition({ (UIViewControllerTransitionCoordinatorContext) -> Void in

        let orient = UIApplication.sharedApplication().statusBarOrientation

        switch orient {
        case .Portrait:
            println("Portrait")
            // Do something
        default:
            println("Anything But Portrait")
            // Do something else
        }

        }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
            println("rotation completed")
    })

    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
}

To dziwne, ponieważ umieściłem to w moim kontrolerze ViewController i nie było to printnic w moim dzienniku. Chyba dlatego, że ta metoda nie jest wywoływana. Czy możesz wymyślić coś innego, co musiałoby być podłączone, aby to zadziałało?
— Wycieczka

Właśnie dodałem go do pustego projektu (Universal App) i działa dobrze bez potrzeby dodawania czegokolwiek. Może umieść instrukcję log na samym początku metody i zobacz, czy jest wywoływana. Nie przychodzi mi do głowy nic, co musiałbyś dodać. Z jakiego iOS korzystasz?
— DogCoffee

@ DogCoffee… nie dzwoni. Czy ma to coś wspólnego z symulatorem?
— Saty

@Saty działa również w symulatorze - po prostu sprawdziłem ponownie. Działa zgodnie z oczekiwaniami.
— DogCoffee

1
statusbarorientation jest przestarzała w iOS 9. Co jeszcze jest tą opcją?
— Deepak Sharma

10

iOS 10.3 i Swift 3

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {

        coordinator.animate(alongsideTransition: { (_) in
            let orient = newCollection.verticalSizeClass

            switch orient {
            case .compact:
                print("Lanscape")///Excluding iPads!!!

            default:
                print("Portrait")
            }
        }, completion: { _ in
            print("rotation completed")
        })

        super.willTransition(to: newCollection, with: coordinator)
    }

Dlaczego potrzebujesz animacji? Nie możesz od razu sprawdzić „newCollection”?
— cyjanek,

@cyanide, aby zsynchronizować animację z moim
— Mike Glukhov.

7

Zaakceptowana odpowiedź w Swift 3 :

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
    coordinator.animate(alongsideTransition: { (_) in
        let orient = UIApplication.shared.statusBarOrientation

        switch orient {
        case .portrait:
            print("Portrait")
        // Do something
        default:
            print("Anything But Portrait")
            // Do something else
        }
    }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
      print("rotation completed")
    })

    super.willTransition(to: newCollection, with: coordinator)
}

U mnie działa dobrze 👍


U mnie nie działa na iOS 10 - drukuje starą orientację, a nie nową.
— Vaddadi Kartick

1
@VaddadiKartick, ponieważ powinieneś używaćlet orient = newCollection.verticalSizeClass switch orient { case .compact: print("Lanscape") // Do something default: print("Portrait") // Do something else }
— Mike Glukhov

5

Ponieważ pytanie brzmiało: co jest odpowiednikiem didRotateFromInterfaceOrientation

Pomyślałem, że udostępnię poniższy kod:

@implementation ViewController
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    if (previousTraitCollection.verticalSizeClass == UIUserInterfaceSizeClassRegular) {
        NSLog(@"User has rotated to landscape");
    } else if (previousTraitCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact) {
        NSLog(@"User has rotated to portrait");
    }
}
@end

Testowałem na iPhonie w symulatorze, ale moje instrukcje drukowania nie zostaną uruchomione, jeśli przetestuję na iPadzie, ponieważ zbiór cech nie ulegnie zmianie.

Jest to dziwne, ponieważ dokładnie to zaleca Apple :

- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {
    [super traitCollectionDidChange: previousTraitCollection];
    if ((self.traitCollection.verticalSizeClass != previousTraitCollection.verticalSizeClass)
        || self.traitCollection.horizontalSizeClass != previousTraitCollection.horizontalSizeClass)) {
        // your custom implementation here
    }
}

Brakuje nawiasu w drugim fragmencie kodu
— Anton Duzenko

Czy to działa na iPadzie, gdzie klasy pionowe i poziome są zwykłe na pełnym ekranie?
— Deepak Sharma

Twój kod nie jest taki sam, jak kod firmy Apple, testujesz tylko klasę rozmiaru pionowego.
— ADG,

Minęło trochę czasu, wygląda na to, że zawartość linku uległa zmianie.
— NYC Tech Engineer

3

[[UIApplication sharedApplication] statusBarOrientation]jest przestarzały w iOS9, musisz przetestować go pod kątem UITraitCollection dla różnych urządzeń.

  override func willTransitionToTraitCollection(newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

    if newCollection.containsTraitsInCollection(UITraitCollection(verticalSizeClass: .Regular)) {
      ...
    }
  }

6
Tylko ustawiający został wycofany. Pracownik Apple napisał: „Czytanie orientacji paska stanu nie jest przestarzałe, tylko pisanie do niego jest. Może to być błąd w konstruowaniu nagłówka, jeśli widzisz to w programie pobierającym”. ( forums.developer.apple.com/thread/12937 )
— Graham Perks

Czy metoda getter również nie jest przestarzała? Zgodnie z dokumentacją tak.
— Groot

0

Na iPadzie nie ma zmiany kolekcji cech, więc oto jak wykryjesz rotację od początku do zakończenia. Oto składnia Swift 5:

override func viewWillTransition(to size: CGSize, with coordinator: 
UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    coordinator.animate(alongsideTransition: { [unowned self] _ in

        self.view.backgroundColor = UIColor.blue
        print("rotation in progress")

    }) { [unowned self] _ in
        self.view.backgroundColor = UIColor.green
        print("rotation complete")


    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.