【发布时间】: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
})
我还在导航栏上更改颜色以在打开时清除颜色,并在打开时恢复默认颜色。
当它分手时,它看起来不太好。可能是什么原因?我该如何解决?
【问题讨论】:
-
请注意:我已经在使用睡眠,但它并不总是有效。我需要一些干净的解决方案:)