【问题标题】:UIView animation on Navigation Bar sometimes working wrong导航栏上的 UIView 动画有时会出错
【发布时间】:2015-11-23 02:18:48
【问题描述】:

我在视图中嵌入了一个按钮,该按钮位于 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 个属性时遇到了一些问题。所以我决定制作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
    })

我还在导航栏上更改颜色以在打开时清除颜色,并在打开时恢复默认颜色。

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

【问题讨论】:

  • 请注意:我已经在使用睡眠,但它并不总是有效。我需要一些干净的解决方案:)

标签: ios swift


【解决方案1】:

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

【讨论】:

  • 我忘了告诉我我已经在使用睡眠了 :D 它只是在代码的另一部分。没有它总是很糟糕。
  • 哈哈该死,希望我能帮上忙!但是是的,那时我和你在同一个地方。
猜你喜欢
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多