在我们的应用中,我们有一个自定义提醒通知,基本上是UITabBarItem
内的一个圈子。我通过获取UITabBarItem
的视图然后在适当的位置创建CAShapeLayer
来添加它。不幸的是,无论我尝试什么,我都无法获得动画的形状。我尝试过动画各种属性,比如path和fillColor,但没有成功。
这是一段代码摘录:
var lyrShape = CAShapeLayer()
lyrShape.fillColor = UIColor.red.cgColor
lyrShape.path = UIBezierPath(overIn: CGRect(x: 5, y: 5, width: 10, height: 10)).cgPath
vwTabBar.layer.addSublayer(lyrShape)
var aniShape = CABasicAnimation(keyPath: "fillColor")
aniShape.duration = 5
aniShape.toValue = UIColor.blue.cgColor
aniShape.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)
aniShape.fillMode = kCAFillModeBoth
aniShape.autoreverses = true
aniShape.repeatCount = 20
lyrShape.add(aniShape, forKey: aniShape.keyPath)
我已经在常规视图中尝试了此代码并且效果很好,但无论我尝试什么,我都无法在UITabBarItem
中使用它。
更新:我已经找到了重现此错误的确切步骤。使用带有按钮的普通旧视图控制器启动应用程序。在该按钮上单击,显示选项卡控制器视图。您在TabBarItem中绘制的形状此时不会设置动画。但是:如果TabBarController作为第一个视图启动,那么动画就可以了。
有没有人有任何想法?
谢谢!
答案 0 :(得分:1)
首先,我会说你问了一个很好的问题。我甚至在寻找类似的东西,我得到了答案。您需要创建一个自定义类的UITabBarController ,然后您可以执行以下操作:
override func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) {
if item.tag == 1{
//do our animations
self.secondItemImageView.transform = CGAffineTransformIdentity
UIView.animateWithDuration(0.7, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 1, options: .CurveEaseInOut, animations: { () -> Void in
let rotation = CGAffineTransformMakeRotation(CGFloat(M_PI_2))
self.secondItemImageView.transform = rotation
}, completion: nil)
}
}
我从最近阅读的博客文章中得到了这个答案。为了进一步明确这一点,我建议你参考这个博客: https://medium.com/@werry_paxman/bring-your-uitabbar-to-life-animating-uitabbaritem-images-with-swift-and-coregraphics-d3be75eb8d4d
我希望这会对你有所帮助:)。
答案 1 :(得分:1)
因此,在我提交错误报告后,我终于从Apple收到了回复。他们告诉我,我所做的事情不受支持,并且他们不打算修复它。不完全是我想要的答案,但至少是答案。
希望这有助于其他人遇到这种情况。
詹姆斯