Döndürme yöntemleri kullanımdan kaldırıldı, 'didRotateFromInterfaceOrientation' eşdeğeri?


137

viewWillTransitionToSizeİOS 8'de tanıtılan yeni yöntemi uygulamaya çalışıyorum (diğer tüm döndürme yöntemleri kullanımdan kaldırıldı). didRotateFromInterfaceOrientationYapmamız gereken bir dizi temizleme görevi olduğu için şu anda eşdeğerinin ne olduğunu bilmek istiyorum ve UIViewControllerTransitionCoordinatoryeni bir 'geçiş' olduğunda çağrılmak için atayabileceğimiz bir blok göremiyorum boyut biter. Teşekkürler.

Yanıtlar:


255

Tamam buldum, sadece animateAlongsideTransition:completion:geçilen yöntemi kullanmak zorunda 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];
}

DidRotateFromInterfaceOrientation gibi her döndürdüğümüzde bu yöntem çağıracak mı? Lütfen kullandığınız yöntemi paylaşır mısınız? Teşekkür ederim
ask123

2
Evet olacak. Benim yaptığım bu: - (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]; }
garip

1
Teşekkürler - İnsanlara biraz zaman kazandırmak için cevap olarak hızlı bir sürüm ekleyeceğim
DogCoffee

3
statusbarorientation iOS 9'da kullanımdan kaldırıldı. Seçenek başka nedir?
Deepak Sharma

1
@DeepakSharma Partiye biraz geç kaldım ama kullanabilirsiniz [UIDevice currentDevice].orientation. Ayrıca bunu UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)veya içine de ekleyebilirsiniz UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation). Bu yardımcı olur umarım!
Jeff

70

Cevabın Hızlı Sürümü

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)
}

Garip çünkü bunu ViewController'ımın içine koydum ve günlüküme printhiçbir şey yapmadı . Sanırım bu yöntem çağrılmadı. Bunun çalışması için takılması gereken başka bir şey düşünebiliyor musunuz?
Yolculuk

Boş bir projeye (Universal App) ekledim ve hiçbir şey eklemeye gerek kalmadan iyi çalışıyor. Belki de yöntemin en başına bir günlük ifadesi koyup çağrılıp çağrılmadığına bakın. Eklemeniz gereken bir şey düşünemiyorum. Hangi iOS'u çalıştırıyorsunuz?
DogCoffee

@ DogCoffee .. çağrılmıyor. Simülatör ile bir ilgisi var mı?
16'da Saty

@Saty simülatörde de çalışır - daha sonra tekrar kontrol edilir. Beklendiği gibi çalışır.
DogCoffee

1
statusbarorientation iOS 9'da kullanımdan kaldırıldı. Seçenek başka nedir?
Deepak Sharma

10

iOS 10.3 ve 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)
    }

Neden animasyona ihtiyacınız var? 'NewCollection'ı hemen kontrol edemiyor musunuz?
Siyanür

@cyanide animasyonu benim ile senkronize edecek
Mike Glukhov

7

Swift 3'te kabul edilen cevap :

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)
}

Benim için iyi çalışıyor 👍


İOS 10'da benim için çalışmıyor - eski yönü yazdırıyor, yenisini yazdırmıyor.
Vaddadi Kartick

1
@VaddadiKartick çünkü kullanmalısınlet orient = newCollection.verticalSizeClass switch orient { case .compact: print("Lanscape") // Do something default: print("Portrait") // Do something else }
Mike Glukhov

5

Soru şuydu: didRotateFromInterfaceOrientation

Aşağıdaki kodu katkıda bulunacağımı düşündüm:

@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

Simülatörde bir iPhone üzerinde test yapıyordum, ancak traitsCollection değişmeyeceği için iPad'i test edersem baskı ifadelerim çalışmayacak.

Bu garip çünkü Apple'ın önerdiği şey bu :

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

İkinci kod pasajında ​​eksik bir braket var
Anton Duzenko

Bu, hem dikey hem de yatay sınıfların tam ekranda Düzenli olduğu iPad'de çalışıyor mu?
Deepak Sharma

Kodunuz Apple'ınkiyle aynı değil, yalnızca dikey boyut sınıfını test ediyorsunuz.
ADG

Bir süredir bağlantının içeriği değişmiş gibi görünüyor.
NYC Teknik Mühendisi

3

[[UIApplication sharedApplication] statusBarOrientation]iOS9'da kullanımdan kaldırıldı, çeşitli cihazlar için UITraitCollection'a karşı test etmeniz gerekiyor .

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

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

6
Yalnızca ayarlayıcı kullanımdan kaldırıldı. Bir Apple çalışanı, "Durum çubuğu yönünü okumak onaylanmamıştır, yalnızca ona yazılır. Bu, alıcıda görüyorsanız başlığı nasıl oluşturduğumuzda bir hata olabilir." ( forums.developer.apple.com/thread/12937 )
Graham Perks

Alıcı aynı zamanda itiraz değil. Belgelere göre öyle.
Groot

0

Ipad'de özellik koleksiyonu değişikliği yoktur, bu nedenle başlangıç ​​ve bitişten rotasyonu nasıl tespit edeceğiniz aşağıda açıklanmıştır. İşte Swift 5 sözdizimi:

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")


    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.