Saya mencoba menerapkan viewWillTransitionToSize
metode baru yang telah diperkenalkan di iOS 8 (semua metode rotasi lainnya sudah tidak digunakan lagi). Saya ingin tahu apa yang setara dengan didRotateFromInterfaceOrientation
sekarang karena ada sejumlah tugas pembersihan yang perlu kami lakukan dan saya tidak dapat melihat blok yang dapat kami tetapkan untuk UIViewControllerTransitionCoordinator
dipanggil saat 'transisi' ke yang baru ukuran selesai. Terima kasih.
ios
iphone
objective-c
ios8
aneh
sumber
sumber
- (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]; }
[UIDevice currentDevice].orientation
. Anda juga dapat menyalurkannya keUIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)
atauUIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)
. Semoga ini membantu!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) }
sumber
print
apa pun di log saya. Saya kira karena metode ini tidak dipanggil. Dapatkah Anda memikirkan hal lain yang perlu dicolokkan agar ini berfungsi?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) }
sumber
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 👍
sumber
let orient = newCollection.verticalSizeClass switch orient { case .compact: print("Lanscape") // Do something default: print("Portrait") // Do something else }
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 } }
sumber
[[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)) { ... } }
sumber
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") } }
sumber