如何为标签栏的项目设置动画

时间:2018-10-24 16:26:31

标签: ios swift uitabbarcontroller

在我的Swift应用程序中,我有一个处理UITabBar的类。

class CustomTabBar: UITabBar {
    override func awakeFromNib() {
        super.awakeFromNib()
    }
}

当用户点击它们时,如何为它们设置动画? 我的意思是CGAffine(scaleX: 1.1, y: 1.1) 那么如何为选项卡栏的项目设置动画?

3 个答案:

答案 0 :(得分:3)

由于UITabBarItem不是UIView子类,而是NSObject子类,因此在点击时没有直接对项目进行动画处理的方法。

您要么必须挖掘属于该项目的UIView并为其设置动画,要么创建一个自定义标签栏。

Here是挖掘UIView的一些想法。以及here for example如何在点击某个项目时被触发。但是使用这种方法要非常小心:

  • Apple可能会更改UITabBar实现,这可能会破坏这一实现。
  • 您可能会干扰iOS动画并获得怪异的效果。

顺便说一句,不需要子类UITabBar。只需执行UITabBarDelegate

实际上,我建议您坚持使用标准的UITabBar行为和外观选项,并在以后解决或根本不解决。诸如此类的事情可能会消耗您的时间,而不会给应用程序添加太多内容。

答案 1 :(得分:3)

这对我有用:

class MyCustomTabController: UITabBarController {

    override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
        guard let barItemView = item.value(forKey: "view") as? UIView else { return }

        let timeInterval: TimeInterval = 0.3
        let propertyAnimator = UIViewPropertyAnimator(duration: timeInterval, dampingRatio: 0.5) {
            barItemView.transform = CGAffineTransform.identity.scaledBy(x: 0.9, y: 0.9)
        }
        propertyAnimator.addAnimations({ barItemView.transform = .identity }, delayFactor: CGFloat(timeInterval))
        propertyAnimator.startAnimation()
    }

}

答案 2 :(得分:2)

首先:

如下创建自定义UITabBarController

import UIKit

enum TabbarItemTag: Int {
    case firstViewController = 101
    case secondViewConroller = 102
}

class CustomTabBarController: UITabBarController {
    var firstTabbarItemImageView: UIImageView!
    var secondTabbarItemImageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let firstItemView = tabBar.subviews.first!
        firstTabbarItemImageView = firstItemView.subviews.first as? UIImageView
        firstTabbarItemImageView.contentMode = .center

        let secondItemView = self.tabBar.subviews[1]
        self.secondTabbarItemImageView = secondItemView.subviews.first as? UIImageView
        self.secondTabbarItemImageView.contentMode = .center
    }

    private func animate(_ imageView: UIImageView) {
        UIView.animate(withDuration: 0.1, animations: {
            imageView.transform = CGAffineTransform(scaleX: 1.25, y: 1.25)
        }) { _ in
            UIView.animate(withDuration: 0.25, delay: 0.0, usingSpringWithDamping: 0.5, initialSpringVelocity: 3.0, options: .curveEaseInOut, animations: {
                imageView.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
            }, completion: nil)
        }
    }

    override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
        guard let tabbarItemTag = TabbarItemTag(rawValue: item.tag) else {
            return
        }

        switch tabbarItemTag {
        case .firstViewController:
            animate(firstTabbarItemImageView)
        case .secondViewConroller:
            animate(secondTabbarItemImageView)
        }
    }
}

第二:

为每个视图控制器设置tag的{​​{1}}值:

第一个ViewController:

tabBarItem

第二个ViewController:

import UIKit

class FirstViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        tabBarItem.tag = TabbarItemTag.firstViewController.rawValue
    }
}

确保已使用情节提要设置了所有功能(如果您使用的是情节提要),那就足够了!

输出:

enter image description here

您可以检查该回购协议:

https://github.com/AhmadFayyas/Animated-TabbarItem/tree/master

用于说明答案。