Ios 导航栏上的UIView动画有时工作不正常

Ios 导航栏上的UIView动画有时工作不正常,ios,swift,Ios,Swift,我在一个视图中嵌入了一个按钮,它位于uibarbuttonite内部。我想要实现的是创建动画,当我从左侧打开滑动菜单时,动画会将我的按钮向右移动一定量,当我关闭它时会返回 我正在使用此函数创建它: static func createMenuButton(controller:UIViewController) -> UIBarButtonItem { let target = controller.navigationController!.parentViewControlle

我在一个视图中嵌入了一个按钮,它位于uibarbuttonite内部。我想要实现的是创建动画,当我从左侧打开滑动菜单时,动画会将我的按钮向右移动一定量,当我关闭它时会返回

我正在使用此函数创建它:

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
}
我也想旋转它,但是我在同时更改两个属性时遇到了一些问题。因此,我决定制作两个单独的动画(这是用于打开,用于关闭的动画相同,但方向相反):

翻译容器(CGAffine的翻译无法正常工作):

内部旋转按钮:

UIView.animateWithDuration(0.3, animations: {
            menuButton.transform = CGAffineTransformMakeRotation(CGFloat(M_PI_2))
            }, completion: nil)
它在90%的情况下有效。但有时,当关闭按钮时,它会传送到屏幕外,并从那个里移向终点

同时,我还将菜单视图控制器从屏幕外部移动(与关闭正好相反的值相同):

我还将导航栏上的颜色更改为打开时清除颜色,打开时恢复为默认颜色


当它破裂时,它看起来不太好。原因可能是什么?如何修复它?

我最近遇到了一个类似的问题,与您描述的设置相同。我花了很多时间来尝试让它工作,但它仍然不是100%,但我必须做的一件事让它工作大部分时间是创建一个调度队列,并在等待仅十分之一秒后将完成动画放入该队列中。我认为这与调用完成处理程序时尚未完全设置帧有关,尽管您可能会认为是这样,但这样做对我来说很有效,希望它能帮助您

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

我忘了告诉你我已经在使用sleep:D了,这只是代码的另一部分。没有它总是不好的。哈哈,该死的,希望我能帮上忙!但是我和你在同一个地方。只是提醒一下:我已经在使用睡眠了,但它并不总是有效的。我需要一些干净的溶液:)
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
    })
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
})