2016-07-19 37 views
2

Ich versuche eine Ansicht zu erstellen, die ein Bild kontinuierlich von rechts nach links scrollt, wodurch effektiv ein Hintergrund erstellt wird, der unbegrenzt scrollt. Ich habe dies mit zwei nebeneinander liegenden Bildansichten erstellt und eine UIView Animation verwendet, die auf .Repeat gesetzt wurde und die Frames mit einem negativen horizontalen Offset umwandelt. (Code unten)Warum friert die wiederholte UIView-Animation beim Edge Swipe?

Es funktioniert super! Bis ich eine Kante Swipe in Navigation-Controller versuchen, an dem die Animation friert Punkt:

animation freezing on edge swipe

Mein Code sieht so aus:

class ScrollingImageView: UIView { 
    required init?(coder aDecoder: NSCoder) { fatalError() } 

    let imageView = UIImageView() 
    let imageView2 = UIImageView() 

    override init(frame: CGRect) { 
     super.init(frame: frame) 


     imageView.image = UIImage(named: "mario") 
     imageView2.image = UIImage(named: "mario") 

     imageView.frame = bounds 
     imageView2.frame = CGRectOffset(bounds, bounds.width, 0) 

     addSubview(imageView) 
     addSubview(imageView2) 
    } 

    func play() { 
     UIView.animateWithDuration(5, delay: 0, options: [.Repeat, .CurveLinear], animations: { 
      self.imageView.frame = CGRectOffset(self.imageView.frame, -self.bounds.width, 0) 
      self.imageView2.frame = CGRectOffset(self.imageView2.frame, -self.bounds.width, 0) 
     }, completion: nil) 
    } 
} 

Warum die Animation stoppen, wenn diese Interaktion beginnt? Ich denke, es hat etwas mit der interaktiven Geste Einstellung der Geschwindigkeit auf CALayer zu Null zu tun. Gibt es eine Möglichkeit, diese Animation weiterspielen zu lassen?

+1

"Ich denke, es hat etwas mit der interaktiven Geste zu tun, die die Geschwindigkeit auf dem CALayer auf Null setzt" Bingo! Genau so funktioniert eine interaktive Geste. – matt

+0

@matt gibt es keine Möglichkeit für diese Animation, nicht an der interaktiven Geste teilzunehmen? Ich habe überlegt, 'CADisplayLink' zu verwenden, um die Frames selbst zu orchestrieren, aber das scheint hässlich zu sein. Irgendwelche Vorschläge? –

+0

Ich würde den anderen Weg gehen: mach deine eigene interaktive Geste. Siehe meine Antwort ... – matt

Antwort

1

Wie Sie richtig sagen, verwenden Sie eine interaktive Geste. Wie funktioniert es? Es friert die Animation ein (die Ebene speed ist Null) und ändert ihren "Rahmen" (Ebene) so, dass sie mit der aktuellen Position der Geste übereinstimmt.

Um dies zu umgehen, könnten Sie vielleicht die Animation in eine andere Ebene legen, obwohl ich mir nicht sicher bin. Die Art und Weise, die ich sicher bin wäre Arbeit wäre, die gesamte benutzerdefinierte Übergang Interaktion selbst zu implementieren - nicht mit der UIPercentDrivenInteractiveTransition (die die Animation friert) aber Positionierung der Ansicht selbst, wie der Übergang weitergeht.

+0

Das fühlt sich wirklich wie Overkill, da es nur ein Standard-Navigation Controller & Übergang ist . Und in meiner realen Anwendung ist es nur ein Element in einem ziemlich komplizierten Ansichtsbaum, so dass der Ansichtscontroller einige Abstraktionsebenen überspringen würde, um etwas Bestimmtes für diese Ansicht zu tun. –

+0

Auch sollte ich dies in die ursprüngliche Frage aufgenommen haben, stoppt die Animation auch, wenn ich die App an den Hintergrund sende, und bringe es dann wieder in den Vordergrund. Ist das das gleiche Problem, oder würde das eine andere Frage rechtfertigen? (Interessanterweise pausiert'UIActivityIndicatorView' während einer interaktiven Transition ähnlich, aber * nicht * friert bei der Wiederaufnahme einer Hintergrund-App ein) –

+0

"Außerdem hätte ich das in die ursprüngliche Frage aufgenommen, die Animation stoppt auch, wenn ich die App an die Hintergrund, und dann bringen Sie es wieder in den Vordergrund. Ist das das gleiche Problem, oder würde das eine andere Frage rechtfertigen "Nein, das ist normal. Animationen werden abgebrochen, wenn Sie in den Hintergrund treten. Es liegt an dir weiterzumachen, wenn du in den Vordergrund kommst. – matt