当 TabBatController.selectedIndex 以编程方式更改时查看转换
View transitions when TabBatController.selectedIndex changed programmatically
当我以编程方式更改 UITabBarController.selectedIndex
时,我很难让视图转换动画。
当我点击 TabBar
图标时,动画效果很好,但是当我从 gestureRecognizer
动作更改 selectedIndex
时。
TabBar 控制器 class 的转换代码如下:
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
if CanChangeTab {
guard let fromView = tabBarController.selectedViewController!.view, let toView = viewController.view else {
return false // Make sure you want this as false
}
if fromView != toView {
if (tabBarController.prevIndex > tabBarController.selectedIndex) {
UIView.transition(from: fromView, to: toView, duration: 0.3, options: [.transitionFlipFromLeft], completion: nil)
} else {
UIView.transition(from: fromView, to: toView, duration: 0.3, options: [.transitionFlipFromRight], completion: nil)
}
}
return true
} else {
return false
}
}
手势识别器正在调用以下函数,上面的代码未从中调用:
@objc func swiped(_ gesture: UISwipeGestureRecognizer) {
if (CanChangeTab) {
self.tabBarController?.prevIndex = (self.tabBarController?.selectedIndex)!
if gesture.direction == .left {
if (self.tabBarController?.selectedIndex)! < 4 { // set your total tabs here
self.tabBarController?.selectedIndex += 1
}
} else if gesture.direction == .right {
if (self.tabBarController?.selectedIndex)! > 0 {
self.tabBarController?.selectedIndex -= 1
}
}
}
}
我看不出应该调用或覆盖什么来获得手势基础动画的变化。
问题是你正在做的不是如何做标签栏控制器动画。您必须编写正式结构化的 自定义动画过渡。
这意味着:
你的标签栏控制器有一个委托实现 animationControllerForTransitionFrom
到 return 一个 UIViewControllerAnimatedTransitioning 对象,interactionControllerFor
到 return 一个 UIViewControllerInteractiveTransitioning 对象。
这些对象实现 startInteractiveTransition
、interruptibleAnimator(using:)
、transitionDuration(using:)
、animateTransition(using:)
和 animationEnded
以通过 UIViewPropertyAnimator 执行动画.
然后手势识别器将能够通过设置 selectedIndex
来触发动画,并且能够通过提供的 UIViewControllerContextTransitioning 对象和 UIViewPropertyAnimator 跟踪和更新动画。
好的。我找到了解决方案,使用
正如马特提议的那样。
因此,使用扩展程序 + 扩展程序中的 animateToTab 函数并更改我的滑动方法,它按预期工作。
@objc func swiped(_ gesture: UISwipeGestureRecognizer) {
if (CanChangeTab) {
let thisTabController = self.tabBarController as! iBayTabController
thisTabController.prevIndex = (thisTabController.selectedIndex)
if gesture.direction == .left {
if thisTabController.selectedIndex < 4 { // set your total tabs here
thisTabController.animateToTab(toIndex: thisTabController.selectedIndex+1)
}
} else if gesture.direction == .right {
if (self.tabBarController?.selectedIndex)! > 0 {
thisTabController.animateToTab(toIndex: thisTabController.selectedIndex-1)
}
}
}
}
当我以编程方式更改 UITabBarController.selectedIndex
时,我很难让视图转换动画。
当我点击 TabBar
图标时,动画效果很好,但是当我从 gestureRecognizer
动作更改 selectedIndex
时。
TabBar 控制器 class 的转换代码如下:
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
if CanChangeTab {
guard let fromView = tabBarController.selectedViewController!.view, let toView = viewController.view else {
return false // Make sure you want this as false
}
if fromView != toView {
if (tabBarController.prevIndex > tabBarController.selectedIndex) {
UIView.transition(from: fromView, to: toView, duration: 0.3, options: [.transitionFlipFromLeft], completion: nil)
} else {
UIView.transition(from: fromView, to: toView, duration: 0.3, options: [.transitionFlipFromRight], completion: nil)
}
}
return true
} else {
return false
}
}
手势识别器正在调用以下函数,上面的代码未从中调用:
@objc func swiped(_ gesture: UISwipeGestureRecognizer) {
if (CanChangeTab) {
self.tabBarController?.prevIndex = (self.tabBarController?.selectedIndex)!
if gesture.direction == .left {
if (self.tabBarController?.selectedIndex)! < 4 { // set your total tabs here
self.tabBarController?.selectedIndex += 1
}
} else if gesture.direction == .right {
if (self.tabBarController?.selectedIndex)! > 0 {
self.tabBarController?.selectedIndex -= 1
}
}
}
}
我看不出应该调用或覆盖什么来获得手势基础动画的变化。
问题是你正在做的不是如何做标签栏控制器动画。您必须编写正式结构化的 自定义动画过渡。
这意味着:
你的标签栏控制器有一个委托实现
animationControllerForTransitionFrom
到 return 一个 UIViewControllerAnimatedTransitioning 对象,interactionControllerFor
到 return 一个 UIViewControllerInteractiveTransitioning 对象。这些对象实现
startInteractiveTransition
、interruptibleAnimator(using:)
、transitionDuration(using:)
、animateTransition(using:)
和animationEnded
以通过 UIViewPropertyAnimator 执行动画.
然后手势识别器将能够通过设置 selectedIndex
来触发动画,并且能够通过提供的 UIViewControllerContextTransitioning 对象和 UIViewPropertyAnimator 跟踪和更新动画。
好的。我找到了解决方案,使用
正如马特提议的那样。
因此,使用扩展程序 + 扩展程序中的 animateToTab 函数并更改我的滑动方法,它按预期工作。
@objc func swiped(_ gesture: UISwipeGestureRecognizer) {
if (CanChangeTab) {
let thisTabController = self.tabBarController as! iBayTabController
thisTabController.prevIndex = (thisTabController.selectedIndex)
if gesture.direction == .left {
if thisTabController.selectedIndex < 4 { // set your total tabs here
thisTabController.animateToTab(toIndex: thisTabController.selectedIndex+1)
}
} else if gesture.direction == .right {
if (self.tabBarController?.selectedIndex)! > 0 {
thisTabController.animateToTab(toIndex: thisTabController.selectedIndex-1)
}
}
}
}