UIView.animateWithDuration Nicht Animieren Swift (mal wieder)
Hinweis: ich habe bereits geprüft, die folgende stack-overflow-Probleme:
Sieben und zwanzig Millionen neun hundert sieben tausend fünf hundert siebzig, Zwei und dreißig Millionen zwei hundert neun und zwanzig tausend zwei hundert zwei und fünfzig, Sechs und zwanzig Millionen eins hundert achtzehn tausend eins hundert eins und vierzig, Eins und dreißig Millionen sechs hundert vier tausend drei hundert
Alles was ich versuche zu tun, ist fade animieren, in einer Ansicht (von alpha), die beim Aufruf durch eine IBAction befestigt eine Schaltfläche. Dann Umgekehrt, wenn eine Schaltfläche auf der Ansicht Treffer.
Meine Falten kann sein, dass ich die Verwendung einer zweiten Ansicht, die auf die ViewDock in der storyboard-Ansicht. Die Ansicht wird Hinzugefügt, um die Untersicht zu der Zeit der viewDidLoad-wo der Rahmen/Grenzen sind festgesetzt, um die gleiche wie die superview (eine vollständige Zwischenstopp)
Der Grund, warum dies getan wird als overlay anzeigen, da es ein tutorial Indikator.
Das Ergebnis (wie viele andere, die aufgeführt haben dieses problem) ist, dass die Sicht (und die enthaltenen Steuerelemente) einfach spontan erscheint und verschwindet sofort. Kein verblassen.
Habe ich versucht animationWithDuration mit Verzögerung, mit und ohne Abschluss, mit übergang, und sogar angefangen, mit der alten UIView.beginAnimations.
Nichts funktioniert. Vorschläge sind herzlich willkommen.
Den code in etwa so geradlinig, wie ich es machen kann:
Edit: Erweitert den code um alles relevante
Edit2: TL;DR Alles funktioniert mit der Ausnahme von UIViewAnimateWithDuration das scheint zu ignorieren, den block und die Dauer und führen nur den code inline als sofort-UI ändern. Die Lösung dieses bekommt die bounty
@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()
}
Bitte beachten Sie, angefangen habe ich mit dem folgenden:
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
})
}
FWIW, die Sie übergeben können, 'nil' als Abschluss Blöcke hier. Auch wenn Sie Blockaden haben, die Sie sicherlich nicht wieder alles. Ich bin überrascht, dass der Swift-compiler nicht-flag, das als ein Fehler.
Ich fügte hinzu, alle relevanten code oben. Ich versuchte es mit und ohne return, wie gezeigt, in der original-pre-tweaked fehlerhaften code.
Schließlich. Der view angezeigt und konfiguriert, Prima. Alles ist da, wo es sein soll. Alle UI-Elemente funktionieren und drehen passt der Inhalt von Einschränkungen. Das EINZIGE Problem ist, dass die alpha-änderung wird nicht ausgeführt, wie eine fade. Einfach eine sofortige erscheinen.
Dein code sieht korrekt. Ich habe gesehen, unerwartete UI-Verhalten wie diese, wenn es threading Probleme an anderer Stelle in der app. Versuchen Sie, einen Haltepunkt auf UIView.animateWithDuration() und self.infoDetailView.alpha =... Sind diese beiden wird ausgeführt Thread 1 (Kom.apple.main-thread)?
InformationsquelleAutor Lord Andrei | 2016-04-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie infoDetailView ist unter auto-layout-Einschränkungen, die Sie anrufen layoutIfNeeded auf die Eltern Ansicht innen animateWithDuration:
Theoretisch sollte dies nicht erforderlich sein, wenn Sie ändern Sie einfach die .alpha-Wert, aber vielleicht das könnte das problem sein in diesem Fall.
Es ist ein Kritischer Tipp, dass Sie zu rufen-layout auf dem superview, nicht auf die Ansicht in Frage!
dieser arbeitete für mich (ich war veränderte Randbedingungen Konstante Werte)
Genial, vielen Dank!
InformationsquelleAutor Darko
Gibt es einige seltsame Dinge, die ich sehen kann,
entfernen Sie zuerst:
In der Regel brauchen Sie nicht zu rufen die Methoden manuell, es sei denn, Sie wissen genau, was Sie tun.
Auch, wenn Sie das ändern der Größe:
Sie nie brauchen, um sowohl
bounds
undframe
. Setzen Sie einfachframe
.Auch, Sie sollten wahrscheinlich stellen Sie sicher, dass die anzeigen tatsächlich nicht ignorieren, den Rahmen-Einstellung:
Statt zurücksetzen der frame, setzen Sie einfach autoresize Maske:
Ergibt:
Ich denke, das sollte eigentlich helfen, weil Sie sofortige Animationen sind oft verbunden Probleme mit der Größe.
Wenn das problem weiterhin besteht, sollten Sie prüfen, ob die
infoDetailView
in der animation ist das gleiche Objekt wie dieinfoDetailView
Sie hinzufügen, um den controller.Es gibt nichts falsch mit Ihrem code so, ich bin ziemlich sicher, dass es einige andere versteckte Problem woanders. Es gibt zu viele Möglichkeiten. Wenn Sie könnte, reproduzieren Sie das Problem in einem Beispiel-Projekt und in teilen für uns, dann könnten wir dir helfen.
InformationsquelleAutor Sulthan
Wenn die animation scheint nicht ausführen, dann erwägen, die Prüfung des Status der einzelnen Ansichten, bevor Sie in die animation zu blockieren. Zum Beispiel, wenn die alpha ist schon auf 0,4, dann die animation, die passt Ihre Ansicht, alpha, wird fast sofort, ohne erkennbaren Effekt.
Erwägen Sie die Verwendung einer keyframe-animation statt. Dies ist, was ein shake Animationen in objective-c aussieht.
Hier ist eine post, die Ihnen zeigt, wie Sie alpha mit keyframes https://stackoverflow.com/a/18658081/1951992
InformationsquelleAutor
Stellen Sie sicher
infoDetailView
'sopaque
ist falsch.https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/instp/UIView/opaque
InformationsquelleAutor Jeff
Verwenden Sie diesen code:
InformationsquelleAutor shikha kochar
Versuchen Sie code Unten. Spielen Sie einfach mit alpha und Dauer, Zeit, um es perfekt.
Verstecken func
Zeigen func
InformationsquelleAutor Arun Gupta
Habe ich repliziert den code und es funktioniert gut, es ist alles ok.
Wahrscheinlich müssen Sie Steuern, Einschränkungen, IBOutlet und IBActions verbindungen. Versuchen Sie zu isolieren, diesen code in ein neues Projekt ein, wenn es notwendig ist.
Update: mein code
und mein storyboard und Projekt-Ordner, Foto:
Jedes Objekt (anzeigen und Tasten) sind mit Standard-Einstellungen.
Habe ich kommentiert alle AFLog Linien (wahrscheinlich ist es nur mehr "verbose-Modus" um Ihnen zu helfen) , der rest des Codes ist ok und es tun, was Sie tun aspected, wenn Sie drücken Sie die Schaltfläche öffnen den Blick für fade-in, und wenn Sie Tippen Sie auf die schließen-Schaltfläche die Ansicht ausblendet.
PS Nicht relevant, aber ich bin mit xCode 7.3 , ein neues swift-2.2-Projekt.
Die Ansicht mit dem grünen hintergrund ist "infoDetailView", eine Ansicht Hinzugefügt , in meinem Beispiel die Mitte eines sauberen viewController, und zwei buttons...alle verbindungen (iboutlet und ibactions) , set autolayout, und es funktioniert.
Ich habe das update meiner Antwort mit dem Quellcode und dem storyboard können Sie neues Projekt starten und es versuchen.
InformationsquelleAutor Alessandro Ornano
Haben Sie versucht, ändern Ihre
showInfoView()
etwas mehr wietoggleInfoView
?Er sagt, dass wenn deine Sicht auf alpha 0 ist, dann ändere es auf 1. Sonst machen Sie es 0.
Wenn Sie brauchen, um das geschehen in einer animation versuchen
infoDetailView.alpha = 0.0
wo Sie haben, kommen aus derviewDidLoad
.InformationsquelleAutor Rudi Wever
Für UILabel-Komponente versuchen, änderungen, die Schicht der Hintergrundfarbe statt.
Probieren (Getestet auf Swift 4):
InformationsquelleAutor Wanpaya