自定義TabBar動畫效果 - 頁面轉場(Swift)
前言:之前寫過一篇自定義TabBar動畫效果的部落格OC版本,本篇換成Swift來實現動畫。思路大致相同,有需要可以去上篇部落格中檢視具體的邏輯本篇主要分享一下在Swift中核心程式碼和與OC中區別。
分三步:
1:初始化:
初始化TabBar控制器
遵守UITabBarControllerDelegate代理協議,實現代理方法
2:點選動畫:
核心程式碼
在代理方法tabBarController - didSelect viewController中找到對應選中的tabBarButton並對其做核心動畫
核心程式碼
/// 點選動畫
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
tabBarButtonClick(tabBarButton: getTabBarButton())
}
private func getTabBarButton() -> UIControl {
var tabBarButtons = Array<UIView>()
for tabBarButton in tabBar.subviews {
if (tabBarButton.isKind(of:NSClassFromString("UITabBarButton")!)){
tabBarButtons.append(tabBarButton)
}
}
return tabBarButtons[selectedIndex] as! UIControl
}
private func tabBarButtonClick(tabBarButton : UIControl) {
for imageView in tabBarButton.subviews {
if (imageView.isKind(of: NSClassFromString("UITabBarSwappableImageView")!)){
let animation = CAKeyframeAnimation()
animation.keyPath = "transform.scale"
animation.duration = 0.3
animation.calculationMode = CAAnimationCalculationMode.cubicPaced
animation.values = [1.0,1.1,0.9,1.0]
imageView.layer.add(animation, forKey: nil)
}
}
}
3:滑動動畫:
在代理方法tabBarController - animationControllerForTransitionFrom代理方法中做滑動動畫。
- 這裡可以建立一個類封裝tabBarVc的滑動動畫,類似如下:
/// 滑動動畫
func tabBarController(_ tabBarController: UITabBarController, animationControllerForTransitionFrom fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return DCSlideBarAnimation() //滑動動畫
}
在類DCSlideBarAnimation中去實現具體滑動動畫。
❗️DCSlideBarAnimation類中與OC的不同點:期初在設計OC滑動類的時候我設計一個UIRectEdge屬性來告訴類我當前選中的控制器Vc和選中前控制器Vc的一個方向偏移作為滑動動畫的dx。
❗️在swift中,我取消了這個屬性,從而在類的內部去去通過獲取當前TabVc的viewControllers的index來比較偏移方向。
相比較更建議採用第二種方法,在上傳的程式碼中我沒更改OC原來思路,可以檢視原始碼進行對比。
核心程式碼
// MARK: - 代理方法
extension DCSlideBarAnimation : UIViewControllerAnimatedTransitioning{
/// 設定時間間隔
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.15
}
/// 處理轉場
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
guard let fromeVc = transitionContext.viewController(forKey: .from),
let toVc = transitionContext.viewController(forKey: .to) else { return }
guard let tabVc = UIApplication.shared.keyWindow?.rootViewController as? UITabBarController,
let fromeIndex = tabVc.viewControllers?.index(where: { $0 == fromeVc}),
let toIndex = tabVc.viewControllers?.index(where: { $0 == toVc}) else { return }
guard let formView = transitionContext.view(forKey: .from),
let toView = transitionContext.view(forKey: .to) else { return }
let fromFrame : CGRect = formView.frame
let toFrame : CGRect = toView.frame
var offSet : CGVector?
if toIndex > fromeIndex {
offSet = CGVector(dx: -1, dy: 0)
}else{
offSet = CGVector(dx: 1, dy: 0)
}
guard let animOffSet = offSet else { return }
formView.frame = fromFrame
let ofDx : CGFloat = animOffSet.dx
let ofDy : CGFloat = animOffSet.dy
toView.frame = CGRect.offsetBy(toFrame)(dx: toFrame.size.width * ofDx * -1, dy: toFrame.size.height * ofDy * -1)
transitionContext.containerView.addSubview(toView)
let transitionDuration = self.transitionDuration(using: transitionContext)
UIView.animate(withDuration: transitionDuration, animations: { //動畫
formView.frame = CGRect.offsetBy(fromFrame)(dx: fromFrame.size.width * ofDx * 1, dy: fromFrame.size.height * ofDy * 1)
toView.frame = toFrame;
}) { (_) in
transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
}
}
}
效果預覽(GIF)
OC版地址:自定義TabBar動畫效果 - 頁面轉場
部落格地址
兩個版本程式碼的專案地址:GitHub
相關文章
- 頁面旋轉動畫效果動畫
- react-navigation自定義StackNavigator頁面跳轉動畫ReactNavigation動畫
- TransitionAnimation自定義轉場動畫NaN動畫
- Android SeekBar 自定義thumb,thumb旋轉動畫效果Android動畫
- html頁面自定義文字水印效果案例HTML
- 自定義 tabBartabBar
- Java 給PPT新增動畫效果(預設動畫/自定義動畫)Java動畫
- 鴻蒙HarmonyOS實戰-ArkUI動畫(頁面轉場動畫)鴻蒙UI動畫
- 小程式tabBar跳轉頁面並隱藏tabBartabBar
- Flutter 自定義 TabBarFluttertabBar
- 前端頁面自定義滾動條前端
- vue 自定義元件tabbarVue元件tabBar
- Swift 專案總結 04 自定義控制器轉場Swift
- Swift 專案總結 04 - 自定義控制器轉場Swift
- vue路由切換滑動效果 vue頁面跳轉互動 vue實現動畫跳轉Vue路由動畫
- JavaScript 頁面跳轉效果JavaScript
- 微信小程式 自定義tabbar微信小程式tabBar
- 自定義react-navigation的TabBarReactNavigationtabBar
- 微信小程式自定義tabBar微信小程式tabBar
- iOS OC-自定義TabBar TabBarViewControlleriOStabBarViewController
- Swift 自定義 UIDatePickerSwiftUI
- 自定義OAM錯誤頁面
- 微信小程式底部實現自定義動態Tabbar微信小程式tabBar
- 卡片旋轉動畫效果動畫
- Flutter動畫之自定義動畫元件-FlutterLayoutFlutter動畫元件
- XAF自定義啟動頁
- [譯]Workcation App – 第一部分 . 自定義 Fragment 轉場動畫APPFragment動畫
- 給你的Flutter頁面跳轉加上動畫Flutter動畫
- 教你自定義Flutter錯誤頁面Flutter
- 自定義登入和登出頁面
- 搞定動畫之 JQuery 中的自定義動畫動畫jQuery
- ThinkPHP框架中自定義錯誤頁面和提示頁面PHP框架
- 從頁面底部回到頂部+動畫效果 & 翻頁後從按鈕處回到頁面頂部動畫
- uni-app中自定義動態底部tabbar(附示例原始碼)APPtabBar原始碼
- Swift中自定義運算子Swift
- springboot自定義 404 500錯誤頁面Spring Boot
- Dcat-admin 自定義登入頁面
- Android自定義View播放Gif動畫AndroidView動畫