导航栏上的UIView动画有时会出错

时间:2015-11-20 17:20:01

标签: ios swift

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

我正在使用此功能创建它:

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
}

我也想旋转它,但我在同时更改2个属性时遇到了一些问题。因此,我决定制作两个单独的动画(这是为了打开,关闭它是相同但相反的方向):

翻译容器(由CGAffine翻译没有正常工作):

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

旋转内部按钮:

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

它有效 - 在90%的情况下。但有时候 - 当关闭时 - 按钮会在屏幕外传送并从那里移向终点。

同时我也从屏幕外移动菜单视图控制器(同样关闭正好相反的值):

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

我也会改变导航栏上的颜色,以便在打开时清除颜色,并在打开时恢复为默认颜色。

当它破裂时看起来并不太好。可能是什么原因?我该如何解决?

1 个答案:

答案 0 :(得分:2)

我最近使用您所描述的相同设置遇到了类似的问题。我花了很多时间尝试让它工作,它仍然不是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
})