UITabBarItem内的iOS自定义动画

时间:2017-07-14 12:49:52

标签: ios swift animation

在我们的应用中,我们有一个自定义提醒通知,基本上是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作为第一个视图启动,那么动画就可以了。

有没有人有任何想法?

谢谢!

2 个答案:

答案 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收到了回复。他们告诉我,我所做的事情不受支持,并且他们不打算修复它。不完全是我想要的答案,但至少是答案。

希望这有助于其他人遇到这种情况。

詹姆斯