2015-04-16 13 views
5

Sto tentando di animare il root-view-controller-change nella mia app. Dopo aver scambiato i controller della vista, carico subito i dati necessari per il secondo controller. Mentre i dati si stanno caricando, mostro un loader (MBProgressHUD). Questa è la mia funzione per scambiare i controller di vista:UIView.transitionWithView interrompe il layout del caricatore

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

Tutto bene con questo, ma una cosa - si rompe completamente il caricatore. Allego un'immagine di ciò che sta accadendo: 2nd view controller Questo è il secondo controller di visualizzazione durante la rotazione. Una volta completata la rotazione, il caricatore appare perfettamente a posto, sia lo spinner che l'interpolazione del testo nella posizione corretta nel rettangolo arrotondato.

Davvero non capisco perché succede, qualcuno me lo spiegherebbe, per favore? C'è un modo per prevenirlo?

Il codice del secondo controller della vista in cui mostro il caricatore:

override func viewDidLoad() { 
    super.viewDidLoad() 

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

    createBackground() 
} 

E la mia classe HUD:

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

grazie mille per tutte le idee!

risposta

2

Si sta aggiungendo l'hud a una vista non ancora inizializzata correttamente. Se si sta caricando il controller della vista da uno xib o uno storyboard, la vista e le sottoview hanno le dimensioni così come sono state caricate dall'interfaccia.

È necessario aggiungere l'hud dopo che le visualizzazioni sono state ridimensionate alla loro dimensione finale.

Se si sposta

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

a viewDidLayoutSubviews, dovrebbe funzionare bene.

+0

Perché pensi che la vista non sia correttamente inizializzata in viewDidLoad? Ha già i limiti corretti e la cornice corretta (ad es. (0.0,0.0,320.0,480.0) per un iP4/S). È la rotazione del controller di visualizzazione a farlo impazzire: senza la transizione non ci sono problemi. – Fygo

+0

Come sai che la vista ha la cornice corretta? Hai inserito un log in viewDidLoad? – pteofil

+0

Potrebbe anche importare di quale vista stiamo parlando. Cos'è questa "vista" a cui aggiungi l'hud, la vista principale del controller o una delle sue sottoview? Se è la vista principale, penso che dovresti usarla con self.view. – pteofil

0

Ho notato un problema simile durante lo spostamento di un'app da iOS 7 a iOS 8. Durante le animazioni, specialmente quando era coinvolto il ridimensionamento, le posizioni della vista erano distorte.

Sono abbastanza sicuro che sia un bug. La soluzione più semplice è quella di animare solo gli screenshot o visualizzare le istantanee, non le vere visualizzazioni: è più lavoro e non è possibile animare le visualizzazioni quando è in corso l'animazione principale, ma in generale è una soluzione più stabile.

Problemi correlati