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.

dziwne
źródło

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];
}
dziwne
źródło
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)
}
DogCoffee
źródło
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)
    }
Mike Glukhov
źródło
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 👍

j_gonfer
źródło
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
    }
}
Inżynier NYC Tech
źródło
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)) {
      ...
    }
  }
Yannick
źródło
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")


    }
}
Avi Pogrow
źródło