La animation UIView en la barra de navigation a veces funciona mal

Tengo un button embedded en una vista, que está dentro de UIBarButtonItem. Lo que quiero lograr es crear animation, que mueve mi button por cierta cantidad hacia la derecha cuando abro el menu deslizante desde la izquierda y vuelve cuando lo cierro.

Estoy usando esta function para crearlo:

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 } 

También quiero rotarlo, pero tengo algunos problemas al cambiar 2 properties al mismo time. Así que he decidido hacer 2 animaciones separadas (esto es para abrir, para cerrar es igual, pero en la dirección opuesta):

Traducir contenedor (la traducción de CGAffine no funcionó correctamente):

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

Gire el button dentro:

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

Funciona, en un 90% de casos. Pero a veces, cuando se cierra, el button se teletransporta fuera de la pantalla y se mueve hacia el punto final desde allí.

Al mismo time, también estoy moviendo el controller de vista de menu desde el exterior de la pantalla (lo mismo para cerrar valores opuestos):

 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 }) 

También estoy cambiando de color en la barra de navigation para borrar el color cuando se abre y vuelve al color pnetworkingeterminado cuando se abre.

Cuando se rompe, no se ve muy bien. ¿Cuál podría ser la razón? ¿Cómo puedo arreglarlo?

Recientemente me encontré con un problema similar con la misma configuration que has descrito. Me tomó mucho para tratar de hacerlo funcionar, y todavía no es 100%, pero una cosa que tuve que hacer que funcionó la mayor parte del time fue crear una queue de despacho y colocar tus animaciones de finalización dentro de esa queue después esperando incluso solo 1 décima de segundo. Creo que tiene que ver con los frameworks que todavía no se configuran cuando se llama al manejador de finalización, aunque usted pensaría que lo haría, pero esto me funcionó, ojalá pueda ayudarlo.

 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 })