在我的Swift应用程序中,我有一个处理UITabBar
的类。
class CustomTabBar: UITabBar {
override func awakeFromNib() {
super.awakeFromNib()
}
}
当用户点击它们时,如何为它们设置动画?
我的意思是CGAffine(scaleX: 1.1, y: 1.1)
那么如何为选项卡栏的项目设置动画?
答案 0 :(得分:3)
由于UITabBarItem
不是UIView
子类,而是NSObject
子类,因此在点击时没有直接对项目进行动画处理的方法。
您要么必须挖掘属于该项目的UIView
并为其设置动画,要么创建一个自定义标签栏。
Here是挖掘UIView
的一些想法。以及here for example如何在点击某个项目时被触发。但是使用这种方法要非常小心:
UITabBar
实现,这可能会破坏这一实现。顺便说一句,不需要子类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
}
}
确保已使用情节提要设置了所有功能(如果您使用的是情节提要),那就足够了!
输出:
您可以检查该回购协议:
https://github.com/AhmadFayyas/Animated-TabbarItem/tree/master
用于说明答案。