Metode rotasi tidak digunakan lagi, setara dengan 'didRotateFromInterfaceOrientation'?

138

Saya mencoba menerapkan viewWillTransitionToSizemetode baru yang telah diperkenalkan di iOS 8 (semua metode rotasi lainnya sudah tidak digunakan lagi). Saya ingin tahu apa yang setara dengan didRotateFromInterfaceOrientationsekarang karena ada sejumlah tugas pembersihan yang perlu kami lakukan dan saya tidak dapat melihat blok yang dapat kami tetapkan untuk UIViewControllerTransitionCoordinatordipanggil saat 'transisi' ke yang baru ukuran selesai. Terima kasih.

aneh
sumber

Jawaban:

257

Oke ketemu, hanya harus menggunakan animateAlongsideTransition:completion:metode yang dioper 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];
}
aneh
sumber
Akankah metode ini memanggil setiap kali kita memutar seperti didRotateFromInterfaceOrientation ?. Bisakah Anda memberi tahu saya metode yang telah Anda gunakan. Terima kasih
ask123
2
Ya, tentu saja. Inilah yang saya lakukan: - (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]; }
Aneh
1
Terima kasih - saya akan menambahkan versi cepat sebagai jawaban untuk menghemat waktu
DogCoffee
3
statusbarorientation tidak digunakan lagi di iOS 9. Apa lagi opsinya?
Deepak Sharma
1
@DeepakSharma Saya agak terlambat ke pesta, tetapi Anda dapat menggunakan [UIDevice currentDevice].orientation. Anda juga dapat menyalurkannya ke UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)atau UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation). Semoga ini membantu!
Jeff
70

Versi Swift jawabannya dengan aneh

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
sumber
Aneh karena saya meletakkan ini di ViewController saya, dan tidak ada printapa pun di log saya. Saya kira karena metode ini tidak dipanggil. Dapatkah Anda memikirkan hal lain yang perlu dicolokkan agar ini berfungsi?
Perjalanan
Saya baru saja menambahkannya ke proyek kosong (Aplikasi Universal) dan berfungsi dengan baik tanpa perlu menambahkan apa pun. Mungkin meletakkan pernyataan log di awal metode dan melihat apakah itu dipanggil. Saya tidak dapat memikirkan apa pun yang perlu Anda tambahkan. IOS apa yang Anda jalankan?
DogCoffee
@ DogCoffee..itu tidak dipanggil. Apakah ada hubungannya dengan Simulator?
Saty
@ Saty bekerja di simulator juga - baru diperiksa lagi nanti. Bekerja seperti yang diharapkan.
DogCoffee
1
statusbarorientation tidak digunakan lagi di iOS 9. Apa lagi opsinya?
Deepak Sharma
10

iOS 10.3 & 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
sumber
Mengapa Anda membutuhkan animasi? Tidak bisakah Anda langsung memeriksa 'newCollection'?
sianida
@ sianida untuk menyinkronkan animasi dengan saya
Mike Glukhov
7

Jawaban yang diterima di 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)
}

Ini berfungsi dengan baik untuk saya 👍

j_gonfer
sumber
Tidak berfungsi untuk saya di iOS 10 - ini mencetak orientasi lama, bukan yang baru.
Kartick Vaddadi
1
@VaddadiKartick karena Anda harus menggunakanlet orient = newCollection.verticalSizeClass switch orient { case .compact: print("Lanscape") // Do something default: print("Portrait") // Do something else }
Mike Glukhov
5

Karena pertanyaannya adalah: apa yang setara dengan didRotateFromInterfaceOrientation

Saya pikir saya akan menyumbangkan kode di bawah ini:

@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

Saya menguji pada iPhone di simulator, tetapi pernyataan cetak saya tidak akan berjalan jika saya menguji menggunakan iPad karena traitsCollection tidak akan berubah.

Ini aneh karena inilah yang direkomendasikan Apple :

- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {
    [super traitCollectionDidChange: previousTraitCollection];
    if ((self.traitCollection.verticalSizeClass != previousTraitCollection.verticalSizeClass)
        || self.traitCollection.horizontalSizeClass != previousTraitCollection.horizontalSizeClass)) {
        // your custom implementation here
    }
}
Teknisi Teknologi NYC
sumber
Ada tanda kurung yang hilang dalam potongan kode kedua
Anton Duzenko
Apakah ini berfungsi di iPad di mana kelas vertikal dan horizontal Reguler pada layar penuh?
Deepak Sharma
Kode Anda tidak sama dengan Apple, Anda hanya menguji kelas ukuran vertikal.
ADG
Sudah lama, sepertinya konten link sudah berubah.
NYC Tech Engineer
3

[[UIApplication sharedApplication] statusBarOrientation]tidak digunakan lagi di iOS9, Anda harus menguji UITraitCollection untuk berbagai perangkat.

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

    if newCollection.containsTraitsInCollection(UITraitCollection(verticalSizeClass: .Regular)) {
      ...
    }
  }
Yannick
sumber
6
Hanya penyetel yang tidak digunakan lagi. Seorang karyawan Apple memposting, "Membaca orientasi bilah status tidak usang, hanya menulis untuk itu. Ini mungkin kesalahan dalam cara kami membuat tajuk jika Anda melihatnya pada pengambil." ( forums.developer.apple.com/thread/12937 )
Graham Perks
Bukankah getter juga sudah usang. Menurut dokumentasi itu.
Groot
0

Pada Ipad tidak ada perubahan koleksi sifat, jadi inilah cara Anda mendeteksi rotasi dari awal dan penyelesaian. Berikut adalah sintaks 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
sumber