Nota: Ho già controllato i seguenti problemi di overflow dello stack:UIView.animateWithDuration Non Animazione Swift (di nuovo)
27907570, 32229252, 26118141, 31604300
Tutto quello che sto cercando di fare è animato dissolvenza in una vista (di alfa) quando viene chiamata da una IBAction associata a un pulsante. Quindi invertire quando viene colpito un pulsante sulla vista.
La mia ruga potrebbe essere che sto usando una vista secondaria che si trova sul ViewDock nella visualizzazione dello storyboard. La vista viene aggiunta alla sottoview al momento di viewDidLoad, dove i frame/bounds sono impostati come il superview (per un layover completo)
Il motivo viene eseguito come visualizzazione overlay poiché è un indicatore tutorial .
Il risultato (come molti altri che hanno elencato questo problema) è che la vista (e controlli contenuti) appare semplicemente all'istante e scompare immediatamente. Niente sbiadire
Ho provato animationWithDuration con ritardo, con e senza completamento, con transizione, e anche iniziato con il vecchio UIView.beginAnimations.
Niente funziona. Suggerimenti calorosamente accolti
Il codice è quanto di più semplice come posso farlo:
Edit: ampliato il codice per tutto rilevanti
Edit2: TL; DR Tutto funziona con l'eccezione di UIViewAnimateWithDuration che sembra ignorare la blocco e durata e basta eseguire il codice in linea come modifica immediata dell'interfaccia utente. Risolvere questo ottiene la grazia
@IBOutlet var infoDetailView: UIView! // Connected to the view in the SceneDock
override func viewDidLoad() {
super.viewDidLoad()
// Cut other vDL code that isn't relevant
setupInfoView()
}
func setupInfoView() {
infoDetailView.alpha = 0.0
view.addSubview(infoDetailView)
updateInfoViewRect(infoDetailView.superview!.bounds.size)
}
func updateInfoViewRect(size:CGSize) {
let viewRect = CGRect(origin: CGPointZero, size: size)
infoDetailView.frame = viewRect
infoDetailView.bounds = viewRect
infoDetailView.layoutIfNeeded()
infoDetailView.setNeedsDisplay()
}
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
updateInfoViewRect(size)
}
func hideInfoView() {
AFLog.enter(thisClass)
UIView.animateWithDuration(
2.0,
animations:
{
self.infoDetailView.alpha = 0.0
},
completion:
{ (finished) in
return true
}
)
AFLog.exit(thisClass)
}
func showInfoView() {
AFLog.enter(thisClass)
UIView.animateWithDuration(
2.0,
animations:
{
self.infoDetailView.alpha = 0.75
},
completion:
{ (finished) in
return true
}
)
AFLog.exit(thisClass)
}
// MARK: - IBActions
@IBAction func openInfoView(sender: UIButton) {
showInfoView()
}
@IBAction func closeInfoView(sender: UIButton) {
hideInfoView()
}
Si prega di notare, ho iniziato con il seguente:
func showInfoView() {
UIView.animateWithDuration(2.0, animations: {() -> Void in
self.infoDetailView.alpha = 0.75
})
}
func hideInfoView() {
UIView.animateWithDuration(2.0, animations: {() -> Void in
self.infoDetailView.alpha = 0.00
})
}
"La vista viene aggiunta alla vista secondaria al momento di viewDidLoad" <- vediamo questo codice. –
FWIW, puoi passare 'nil' come blocchi di completamento qui. Anche se hai blocchi, certamente non dovrebbero restituire nulla. Sono sorpreso che il compilatore Swift non lo abbia contrassegnato come un errore. –
@GrahamPerks, ho aggiunto tutto il codice pertinente sopra. L'ho provato con e senza il ritorno come mostrato nel codice fallito originale pre-ottimizzato. –