作者:起五贪黑_719 | 来源:互联网 | 2022-12-09 19:11
我想在tabswitch [1]创建一个类似iOS app facebook的动画.我已经尝试开发某种动画,出现的问题是旧的视图控制器直接在交换机上变得不可见,而不是在新控制器快速滑动时缓慢淡出.
我发现了这个问题如何使用CrossDissolve幻灯片过渡动画标签栏选项卡切换?但正确的标记解决方案并不适用于我(它不是幻灯片,它是一个淡入淡出过渡).我还想得到的是向左或向右滑动以切换标签的功能.就像在旧版本的facebook上一样.
到目前为止我得到的是:
extension TabBarController: UITabBarControllerDelegate {
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
guard let fromView = selectedViewController?.view,
let toView = viewController.view else { return false }
if fromView != toView {
toView.transform = CGAffineTransform(translationX: -90, y: 0)
UIView.animate(withDuration: 0.25, delay: 0.0, options: .curveEaseInOut, animations: {
toView.transform = CGAffineTransform(translationX: 0, y: 0)
})
}; return true
}
}
class TabBarController: UITabBarController {
override func viewDidLoad() {
super.viewDidLoad()
delegate = self
}
}
如何解决这个问题?
[1]
我非常想从Facebook应用程序中添加一个gif.问题是我不想审查视频,只是透露了太多的数据.(即使fb已经拥有它们).另外在youtube上我找不到合适的录音.请在iOS的fb应用程序中自行尝试.
1> matt..:
我从未见过Facebook所以我不知道动画是什么.但是,当标签栏控制器更改其标签(子视图控制器)时,您可以拥有任何您喜欢的动画,连贯且没有任何黑客,使用Apple提供的内置机制将自定义动画添加到视图控制器之间的过渡.它被称为自定义过渡动画.
Apple于2013年首次推出了此机制.以下是其视频的链接:https://developer.apple.com/videos/play/wwdc2013/218/
我立即在我的应用程序中采用了这个,我认为这让它们看起来更加狡猾.这是我喜欢的标签栏控制器自定义转换的演示:
非常酷的是,一旦你决定了你想要什么样的动画,让过渡交互(即用手势而不是点击按钮驱动它)很容易:
现在,你可能会说:好的,但那不是我想到的动画.没问题!一旦掌握了自定义过渡架构,将动画更改为您喜欢的任何内容都很容易.在这个变种中,我只注释掉一行,以便"旧"视图控制器不会滑落:
所以让你的想象力疯狂!采用自定义过渡动画,iOS的方式.
2> Mihai Erős..:
您可以使用以下想法:https://samwize.com/2016/04/27/making-tab-bar-slide-when-selected/
此外,这里是更新到Swift 4.1的代码,我也删除了强制解包:
import UIKit
class MyTabBarController: UITabBarController {
override func viewDidLoad() {
super.viewDidLoad()
delegate = self
}
}
extension MyTabBarController: UITabBarControllerDelegate {
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
guard let tabViewCOntrollers= tabBarController.viewControllers, let toIndex = tabViewControllers.index(of: viewController) else {
return false
}
animateToTab(toIndex: toIndex)
return true
}
func animateToTab(toIndex: Int) {
guard let tabViewCOntrollers= viewControllers,
let selectedVC = selectedViewController else { return }
guard let fromView = selectedVC.view,
let toView = tabViewControllers[toIndex].view,
let fromIndex = tabViewControllers.index(of: selectedVC),
fromIndex != toIndex else { return }
// Add the toView to the tab bar view
fromView.superview?.addSubview(toView)
// Position toView off screen (to the left/right of fromView)
let screenWidth = UIScreen.main.bounds.size.width
let scrollRight = toIndex > fromIndex
let offset = (scrollRight ? screenWidth : -screenWidth)
toView.center = CGPoint(x: fromView.center.x + offset, y: toView.center.y)
// Disable interaction during animation
view.isUserInteractiOnEnabled= false
UIView.animate(withDuration: 0.3,
delay: 0.0,
usingSpringWithDamping: 1,
initialSpringVelocity: 0,
options: .curveEaseOut,
animations: {
// Slide the views by -offset
fromView.center = CGPoint(x: fromView.center.x - offset, y: fromView.center.y)
toView.center = CGPoint(x: toView.center.x - offset, y: toView.center.y)
}, completion: { finished in
// Remove the old view from the tabbar view.
fromView.removeFromSuperview()
self.selectedIndex = toIndex
self.view.isUserInteractiOnEnabled= true
})
}
}
因此,您需要继承UITabBarController并且还必须编写动画部分,您可以调整动画选项(延迟,持续时间等).
我希望它有所帮助,欢呼!