2015-04-16 18 views
5

Uygulamamdaki kök görünüm denetleyicisini değiştirmeye çalışıyorum. Görüntü denetleyicileri değiştirdikten sonra, 2. denetleyici için gereken verileri hemen yüklüyorum. Veri yüklenirken, bir yükleyici (MBProgressHUD) gösteriyorum. Bu görünüm denetleyicileri takas için benim fonksiyonudur: bu iyiUIView.transitionWithView, yükleyicinin düzenini bozuyor

class ViewUtils { 

    class func animateRootViewController(duration: NSTimeInterval, changeToViewController: UIViewController) { 
     let window = UIApplication.sharedApplication().delegate?.window? 
     if window == nil { 
      return 
     } 
     UIView.transitionWithView(window!, 
      duration: duration, 
      options: UIViewAnimationOptions.TransitionFlipFromLeft | UIViewAnimationOptions.AllowAnimatedContent, 
      animations: { 
       window!.rootViewController = changeToViewController 
      }, 
      completion: nil 
     ) 
    } 
} 

Tüm ama bir şey - tamamen yükleyici kırar. Olanlar hakkında bir hayal kurarım: 2nd view controller Bu, döndürürken 2. görünüm denetleyicisidir. Döndürme tamamlandıktan sonra yükleyici, hem eğiricinin hem de metnin, yuvarlatılmış dikdörtgendeki doğru konuma doğru sadece ince bir şekilde görünür.

Gerçekten bunun neden olduğunu anlamıyorum, biri bana açıklar mı lütfen? Bunu engellemenin bir yolu var mı?

Ben yükleyici göstermek 2 görünümü denetleyicisi kodu: herhangi fikirler için

class HUD { 

    private var hudBG: UIView! 
    private var view: UIView! 
    private(set) var isShown = false 

    init(containingView: UIView) { 
     view = containingView 
    } 

    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    func show() { 
     if !isShown { 
      if(hudBG == nil) { 
       hudBG = UIView(frame: CGRectMake(0, 0, view.bounds.width, view.bounds.height)) 
       hudBG.backgroundColor = UIColor(white: 0, alpha: 0.4) 
      } 
      view.addSubview(hudBG) 
      let hud = MBProgressHUD.showHUDAddedTo(view, animated: true) 
      hud.mode = MBProgressHUDModeIndeterminate 
      hud.labelText = "Cargando" 

      hudBG.alpha = 0 

      UIView.animateWithDuration(0.3, animations: {() -> Void in 
       self.hudBG.alpha = 1 
      }) 
      isShown = true 
     } 
    } 

    func hide() { 
     if isShown { 
      UIView.animateWithDuration(0.3, animations: { 
       () -> Void in 
       self.hudBG.alpha = 0 
      }, completion: { 
       (b) -> Void in 
       self.hudBG.removeFromSuperview() 
      }) 
      MBProgressHUD.hideHUDForView(view, animated: true) 
      isShown = false 
     } 
    } 
} 

Çok teşekkürler:

override func viewDidLoad() { 
    super.viewDidLoad() 

    hud = HUD(containingView: view) 
    hud.show() 

    createBackground() 
} 

Ve hud sınıfı!

cevap

2

Henüz düzgün şekilde başlatılmamış bir görünüme hud ekliyorsunuz. Görünüm denetleyicisini bir xib veya storyboard'dan yüklüyorsanız, görünüm ve alt görünümleri, arabirimden yüklendiklerinde boyutlara sahiptir.

Görünümler son boyutlarına getirildikten sonra hud'u eklemeniz gerekir. Eğer viewDidLayoutSubviews için

hud = HUD(containingView: view) 
hud.show() 

taşırsanız

, sorun çıkmaması gerekir.

+0

Görünümün viewDidLoad'da düzgün şekilde başlatıldığını düşünmüyor musunuz? Zaten doğru sınırlara ve doğru çerçeveye (örneğin, bir iP4/S için (0.0.0.0,320.0.480.0)) sahiptir. Görüntü denetleyicinin dönüşünü delirtir - geçiş olmadan sorun olmaz. – Fygo

+0

Görünümün doğru kareye sahip olduğunu nereden biliyorsunuz? ViewDidLoad'a bir giriş yaptın mı? – pteofil

+0

Ayrıca, bahsettiğimiz manzara da önemli olabilir. Bu "görünüm" nedir, denetleyicinin ana görünümüne veya alt görünümlerinden birine hud eklediğiniz nedir? Ana görünüm ise, bence self.view ile kullanmalısınız. – pteofil

0

iOS 7'den iOS 8'ye bir uygulamayı taşırken benzer bir sorun farkettim. Animasyonlar sırasında, özellikle ölçeklendirme söz konusu olduğunda, görünüm konumları bozuk.

Bunun bir hata olduğuna eminim. En basit çözüm, yalnızca ekran görüntülerini canlandırmak veya anlık görüntülemeleri değil, gerçek görünümleri görüntülemektir - daha fazla iş vardır ve ana animasyon devam ederken görünümleri animasyon haline getiremezsiniz, ancak genel olarak daha kararlı bir çözümdür.

İlgili konular