2016-07-14 36 views
16

Bu soru hakkında kesin olan iOS9 +7.3/9/2 + Swift Cihaz döndüğünde dönüş animasyonu nasıl devre dışı bırakılır?

sıradan bir modern bir uygulama var ki (autolayout, evrensel film şeridi) bunu normal AutoRotate isteyen tüm dört rotasyon pozisyonları

enter image description here

izin vermez kullanıcı portre

için manzara cihazı döner Ama sadece cihazı dönen kullanıcıya sırasında YOK animasyon istediğinizde yolu, bu nedenle yeni kısıt tabanlı düzenleri dönüşür. Yeni yanlara veya dikey yerleşime sadece "tıklamak" istersiniz.

Bunu başarmak mümkün olmuştur tek yolu ekleyerek geçerli:

override func viewWillTransitionToSize(size:CGSize, 
     withTransitionCoordinator coordinator:UIViewControllerTransitionCoordinator) 
    { 
    coordinator.animateAlongsideTransition(nil, completion: 
     {_ in 
     UIView.setAnimationsEnabled(true) 
     }) 
    UIView.setAnimationsEnabled(false) 
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator); 
    } 

biri görünümü denetleyicisi, bir yüksek veya yakın en yüksek konteyner görüşlerin kalanını ya da her türlü yer tutan VC sahne.

Temel olarak, animasyonları açmak için RotateToInterfaceOrientation/didRotateFromInterfaceOrientation (her ikisi de artık modern iOS'ta kullanılamaz) kullanmanın aynı eski fikridir.

Ancak birçok sorun

  • bu AppWide çalışmıyor vardır, bu bir felaket, bu sahne tabanlı

  • sadece tüm animasyonları kapatmak için Çok Kötü görünüyor olduğunu

  • Eğer pisti

her türlü görebilirsiniz 0 Bu soru manzara/portre destekleyen bir uygulamada rotasyon animasyonları kapatmak için daha iyi bir yolu var mı, Bu gün kesinlikle iOS9 +

hakkındadır ???

Bu soru kesinlikle iOS9 +

hakkında
+2

Bu iOS sürümü hangi içindir? –

+0

Merhaba @LukeVanIn, kesinlikle iOS9. İlk cümle dikkat! – Fattie

+0

Simülatör üzerinde çalışır, ancak gerçek bir cihazda (ipad) çalışır. “UIView.areAnimationsEnabled()”, animasyon bloğunun içinde “true” ifadesini döndürür; Döndürme animasyonu bloğu ile ilgili bir zamanlama sorunu olmalı ... ('setAnimationsEnabled' doc durumları: '_ Bu yöntem yalnızca çağrıldıktan sonra gönderilen animasyonları etkiler. Mevcut animasyonlar çalışırken bu yöntemi çağırırsanız, bu animasyonlar devam eder. doğal son noktaya ulaşana kadar koşuyorlar. ") – lazi74

cevap

5

Yöntem swizzling'u kullanabilirsiniz.

Bunun yerine, "genericViewWillTransitionToSize" işlevini çağırmak için uygulamanızdaki herhangi bir görünüm denetleyicisindeki "viewWillTransitionToSize" çağrılarını değiştireceğiniz anlamına gelir.
Bu şekilde, alt sınıfı veya uygulamanızdaki tekrarlanan kodu kullanmanız gerekmez.

Bu hüzünle birlikte, büyük bir güçle büyük sorumluluk gelirken, çok karmakarışık olmalısınız. Sınıfı, sizin veya sonraki programlayıcının, kontrolörlerin görüntülenmesi için döndürme animasyonlarını döndürmek istediğinde, onu nasıl bulacağınızı bileceği bir yere koyun.

extension UIViewController { 

    public override static func initialize() { 
     struct Static { 
      static var token: dispatch_once_t = 0 
     } 

     dispatch_once(&Static.token) { 
      let originalSelector = #selector(UIViewController.viewWillTransitionToSize(_:withTransitionCoordinator:)) 
      let swizzledSelector = #selector(UIViewController.genericViewWillTransitionToSize(_:withTransitionCoordinator:)) 

      let originalMethod = class_getInstanceMethod(self, originalSelector) 
      let swizzledMethod = class_getInstanceMethod(self, swizzledSelector) 

      let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)) 

      if didAddMethod { 
       class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)) 
      } else { 
       method_exchangeImplementations(originalMethod, swizzledMethod); 
      } 
     } 
    } 

    // MARK: - Method Swizzling 
    func genericViewWillTransitionToSize(size:CGSize, 
              withTransitionCoordinator coordinator:UIViewControllerTransitionCoordinator) 
    { 
     self.genericViewWillTransitionToSize(size, withTransitionCoordinator: coordinator) 
     coordinator.animateAlongsideTransition(nil, completion: 
      {_ in 
       UIView.setAnimationsEnabled(true) 
     }) 
     UIView.setAnimationsEnabled(false) 
    } 
} 
+0

kaplan kodlaması ... – Fattie

+0

Bu doğru cevap :) – Ori

+0

Bunun için çalıştı –

5

olduğu gibi bildiğim kadarıyla, bunu yapmak için iyi bir yol yoktur.

Bu yöntemle ayrı sınıf bildirmek ve uygulamanızda alt sınıfları tüm görünüm denetleyicileri yapabilirsiniz rağmen.

class NoRotateAnimationVC: UIViewController { 
    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { 
     super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator) 
     UIView.setAnimationsEnabled(false) 
     coordinator.notifyWhenInteractionEndsUsingBlock {_ in UIView.setAnimationsEnabled(true)} 
    } 
} 

cihazın yönünü

, görüşleri kendi boyutlarını değiştirmeye gerek viewWillTransitionToSize yöntem başlatmaya alan tüm görünüm denetleyicileri.

Bu yeni sınıfı uygulamanızda bir kez bildirmeniz ve tüm görüntü denetleyici bildirimlerinizi MyViewController: UIViewController sınıfından MyViewController: NoRotateAnimationVC ürününe değiştirmeniz gerekir.

sağlanan uygulama tüm animasyonlar devre dışı bırakır ve geçişten sonra bunları olanaklı hale getirir. Bu nedenle, yalnızca bir Görünüm Denetleyicisi'nde bu yöntemi geçersiz kılarsanız, görünümü rotasyonun bir sonucu olarak boyutu değiştirdiği sürece, rotasyon animasyonlarını her yerde devre dışı bırakır. Ancak bu görüntüleme denetleyicisi etkin değilse, animasyonlar devre dışı bırakılmaz.

+0

Bu yeni sınıfı uygulamanızda bir kez bildirmeniz ve sonra tüm görünüm denetleyicinizin bildirimlerini" MyViewController: UIViewController {...} "sınıfından" MyViewController: NoRotateAnimationVC { ...} ' – bzz

+0

Ah, HER görüntü denetleyicisinin bunu yapması gerektiğini söylüyorsunuz. Yeterince adil. İlginç bir şekilde, sadece birini seçerseniz buldum - rastgele düşünüyorum - işe yarıyor. (Yine de başka sorunlara neden olabilir mi diye bir fikrim yok.) Tekrar teşekkürler – Fattie

+1

@JoeBlow Cihazı döndürdüğünüzde, görünümlerini boyutlarını değiştirmek isteyen tüm denetim denetleyicileri, "viewWillTransitionToSize" yöntem çağrısı alır. Sağlanan uygulama, tüm animasyonları devre dışı bırakır ve geçişten sonra bunları yeniden etkinleştirir. Bu nedenle, yalnızca bir Görünüm Denetleyicisi'nde bu yöntemi geçersiz kılarsanız, görünümü rotasyonun bir sonucu olarak boyutu değiştirdiği sürece, rotasyon animasyonlarını her yerde devre dışı bırakır. Ancak bu görüntüleme denetleyicisi etkin değilse, animasyonlar devre dışı bırakılmaz. – bzz