2015-11-20 9 views
6

Ich habe eine Schaltfläche in einer Ansicht eingebettet, die in UIBarButtonItem ist. Was ich erreichen möchte, ist eine Animation, die meinen Knopf um einen bestimmten Betrag nach rechts bewegt, wenn ich das Schiebe-Menü von links öffne und zurück gehe, wenn ich es schließe.UIView Animation in der Navigationsleiste funktioniert manchmal falsch

Ich benutze diese Funktion, es zu schaffen:

static func createMenuButton(controller:UIViewController) -> UIBarButtonItem { 
    let target = controller.navigationController!.parentViewController! 
    let menuImage = UIImage(named: "menu.png")!.imageWithRenderingMode(.AlwaysTemplate) 
    let menuButton = UIButton(frame: CGRectMake(0, 0, 22, 22)) 
    menuButton.tintColor = UIColor.blackColor() 
    menuButton.setBackgroundImage(menuImage, forState: .Normal) 
    menuButton.addTarget(target, action: Selector("toggleMenuClicked:"), forControlEvents:.TouchUpInside) 
    let menuButtonContainer = UIView(frame: menuButton.frame) 
    menuButtonContainer.addSubview(menuButton) 
    let menuButtonItem = UIBarButtonItem(customView: menuButtonContainer) 
    return menuButtonItem 
} 

ich es auch drehen wollen, aber ich habe einige Probleme bekam mit 2 Objekte zur gleichen Zeit zu ändern. Also habe ich beschlossen habe 2 separate Animationen zu machen (dies ist zum Öffnen, zum Schließen ist es das gleiche, aber in entgegengesetzter Richtung):

Übersetzen Behälter (Übersetzung von CGAffine nicht richtig funktioniert):

UIView.animateWithDuration(0.3, animations: { 
      menuContainerView.frame = CGRectOffset(menuContainerView.frame, 183, 0.0) 
      }, completion: nil) 

Schaltfläche Drehen innen:

UIView.animateWithDuration(0.3, animations: { 
      menuButton.transform = CGAffineTransformMakeRotation(CGFloat(M_PI_2)) 
      }, completion: nil) 

Es funktioniert - in 90% der Fälle. Aber manchmal - beim Schließen - teleportiert sich die Taste außerhalb des Bildschirms und bewegt sich von dort zum Endpunkt.

UIView.animateWithDuration(0.3, animations: { 
     self.leftViewController!.view.frame = CGRect(x: 0, y: self.view.frame.origin.y, width: 183, height: self.view.frame.height) 
     }, completion: { (Bool) -> Void in 
      self.menuShown = true 
    }) 

Ich ändere auch Farbe auf Navigationsleiste Farbe zu löschen:

In der gleichen Zeit, die ich bin Menü View-Controller von außerhalb des Bildschirms (das gleiche für das Schließen nur entgegengesetzte Werte) bewegt auch wenn es geöffnet ist und zurück zur Standardfarbe, wenn es geöffnet wird.

Wenn es aufbricht, sieht es nicht gut aus. Was könnte der Grund sein? Wie kann ich es reparieren?

+0

Nur eine Anmerkung: Ich benutze bereits Schlaf, aber es funktioniert sowieso nicht immer. Ich brauche eine saubere Lösung :) – Makalele

Antwort

2

Ich lief vor kurzem zu einem ähnlichen Problem mit dem gleichen Setup, das Sie beschrieben haben. Ich habe viel gebraucht, um zu versuchen, es zum Laufen zu bringen, und es ist immer noch nicht 100%, aber eine Sache, die ich erledigen musste, war die meiste Zeit damit, eine Dispatch-Queue zu erstellen und deine Abschlussanimationen danach in diese Queue zu legen Warten Sie nur 1 Zehntelsekunde. Ich denke, es hat damit zu tun, dass die Frames noch nicht ganz gesetzt sind, wenn der Completion-Handler aufgerufen wird, obwohl Sie denken würden, dass es funktionieren würde, aber dies zu tun hat für mich funktioniert, hoffentlich kann es Ihnen helfen.

completion: { (Bool) -> Void in 
    let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(0.05 * Double(NSEC_PER_SEC))) 
    dispatch_after(delayTime, dispatch_get_main_queue()) { 
    self.menuShown = true 
}) 
+0

Ich vergesse zu sagen, ich bin bereits mit Schlaf: D Es ist nur in einem anderen Teil des Codes. Ohne es ist es immer schlecht. – Makalele

+0

Haha Darn, hoffte ich könnte helfen! Aber ja, ich bin dann am selben Ort wie du. – pbush25

Verwandte Themen