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: 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!
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
Come sai che la vista ha la cornice corretta? Hai inserito un log in viewDidLoad? – pteofil
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