2016-08-22 2 views
1

Ich habe Probleme mit der Ein- und Ausblendung einer Animation.Starten der Überblendungsanimation von einem bestimmten Punkt in einer UIView in Swift

Ich habe eine einfache Einrichtung, auf dem Storyboard habe ich eine UIView mit dem Namen myView.

Was ich tun möchte, ist Einblenden myView, wenn der Benutzer den Bildschirm berührt, und Ausblenden myView, wenn der Benutzer aufhört, den Bildschirm zu berühren. Ich kann das mit dem unten stehenden Code erreichen. Die Überblendung erfolgt über fünf Sekunden.

Das Problem tritt jedoch auf, wenn der Benutzer anfängt zu berühren oder den Bildschirm während einer Fade-In- oder Fade-Out-Animation nicht mehr berührt.

Wenn zum Beispiel hält der Benutzer den Bildschirm zu berühren, statt die Fade-In-Animation der myView Fade-In an der aktuellen Position und umgekehrt mit einer Fade-Out-Animation, was geschieht, ist eigentlich myViewalpha springt anmutig zu stoppen 1.0 vor Beginn der Ausblendung.

Frage:

Was unten Notwendigkeit, auf die Änderungen am Code vorgenommen werden, um sicherzustellen, dass jede neue Animation, Fade-In oder Fade-Out, unterbricht die aktuelle Fade-Animation auf myView auftreten und beginnt von der aktuellen alpha der früheren Fade-Animation?

Code:

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet weak var myView: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.myView.alpha = 0 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     UIView.animateWithDuration(5, delay: 0, options: UIViewAnimationOptions.CurveEaseInOut, animations: { 
      self.myView.alpha = 1 
     }, completion: nil) 
    } 

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    } 

    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     UIView.animateWithDuration(5, delay: 0, options: UIViewAnimationOptions.CurveEaseInOut, animations: { 
      self.myView.alpha = 0 
     }, completion: nil) 
    } 

} 
+1

Verzeihen Sie mich für das Schimpfen, aber warum in aller Welt würde jemand diese Frage ablehnen? Es ist schön, informativ und klar gefragt. Genau so stellt man eine Frage zu Stack Overflow. Es ist eine _model_ Frage. – matt

+0

Danke, freundlich. Ich versuche, Fragen, die ich stelle, so klar wie möglich zu strukturieren. – user4806509

+0

Absolut. Lassen Sie sich nicht von Downvotes entmutigen. – matt

Antwort

2

Das Problem ist, dass Ihre touchesEnded Animation Ihre touchesBegan Animation unterbricht, wodurch die touchesBegan Animation für einen Augenblick entfernt und enthüllt werden, dass Sie die alpha-1 gesetzt haben.

Um dies zu verhindern, fügen Sie in Ihre options: die Option .beginFromCurrentState ein.

+0

Wow, so einfach war das. Vielen Dank. Ich habe die Animationsoptionen so aktualisiert und es hat funktioniert. (Ich frage mich, warum 'BeginFromCurrentState' nicht der Standardzustand ist.) ' Optionen: [UIViewAnimationOptions.CurveEaseInOut, UIViewAnimationOptions.BeginFromCurrentState] ' – user4806509

+1

Und der Hinweis war genau dort in Ihrer Frage! Du hast ganz richtig gesagt: "um sicherzustellen, dass jede neue Animation ... vom aktuellen Alpha der vorherigen Fade-Animation ausgeht". Sie haben _exactly_ entdeckt, was das Problem war. Gut gemacht. – matt

+1

PS Der kleine Buchstabe in meinem '.begin' ist, weil das die Schreibweise in Swift 3 ist. Ich fürchte, ich denke heutzutage komplett an Swift 3. – matt

Verwandte Themen