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

Jac*_* K. 5 uitabbarcontroller ios swift

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

class CustomTabBar: UITabBar {
    override func awakeFromNib() {
        super.awakeFromNib()
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Ahm*_*d F 7

第一的:

创建一个自定义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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

第二:

为每个视图控制器设置tagtabBarItem

第一个视图控制器:

import UIKit

class FirstViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        tabBarItem.tag = TabbarItemTag.firstViewController.rawValue
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个视图控制器:

import UIKit

class SecondViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        tabBarItem.tag = TabbarItemTag.secondViewConroller.rawValue
    }
}
Run Code Online (Sandbox Code Playgroud)

确保您的故事板(如果您正在使用)已经设置了所有内容,就这样!

输出:

在此处输入图片说明

你可以检查回购:

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

为了证明答案。


小智 7

这对我有用:

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()
    }

}
Run Code Online (Sandbox Code Playgroud)


mea*_*ers 5

由于UITabBarItem不是UIView子类,而是NSObject子类,因此没有直接的方法可以在点击时为项目设置动画。

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

这里有一些挖掘UIView. 这里举例说明如何在点击项目时触发。但使用这种方法要非常小心:

  • 苹果可能会改变UITabBar实施方式,这可能会打破这一点。
  • 你可能会干扰 iOS 动画并得到奇怪的效果。

顺便说一句,不需要子类化UITabBarUITabBarDelegate您所需要的就是实施。

实际上,我建议您坚持使用标准UITabBar行为和皮肤选项,然后稍后再解决,或者根本不解决。诸如此类的事情会消耗​​您的时间,而不会为应用程序增加太多内容。