自定義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
相關文章
- Swift - 自定義Share分享頁面Swift
- TransitionAnimation自定義轉場動畫NaN動畫
- 自定義轉場動畫(二)動畫
- 自定義轉場動畫(一)動畫
- iOS自定義轉場動畫(push、pop動畫)iOS動畫
- react-navigation自定義StackNavigator頁面跳轉動畫ReactNavigation動畫
- html頁面自定義文字水印效果案例HTML
- 自定義 tabBartabBar
- 一行程式碼實現自定義轉場動畫--iOS自定義轉場動畫集行程動畫iOS
- iOS自定義UIView動畫效果iOSUIView動畫
- 小程式tabBar跳轉頁面並隱藏tabBartabBar
- 鴻蒙HarmonyOS實戰-ArkUI動畫(頁面轉場動畫)鴻蒙UI動畫
- Flutter 自定義 TabBarFluttertabBar
- iOS自定義tabBariOStabBar
- 自定義present和dismiss的轉場動畫動畫
- Android SeekBar 自定義thumb,thumb旋轉動畫效果Android動畫
- iOS自定義轉場動畫實戰講解iOS動畫
- Java 給PPT新增動畫效果(預設動畫/自定義動畫)Java動畫
- JavaWeb 自定義404頁面JavaWeb
- iOS CAAnimation之CATransition (自定義轉場動畫工具類)iOS動畫
- 微信小程式自定義tabBar微信小程式tabBar
- 微信小程式 自定義tabbar微信小程式tabBar
- Android動畫效果之自定義ViewGroup新增布局動畫Android動畫View
- iOS 關於viewController自定義的轉場動畫iOSViewController動畫
- 關於自定義轉場動畫,我都告訴你。動畫
- 自定義OAM錯誤頁面
- Swift 專案總結 04 - 自定義控制器轉場Swift
- Swift 專案總結 04 自定義控制器轉場Swift
- 自定義view 之多個引導層動畫效果View動畫
- 自定義RecyclerView動畫——實現remove飛出效果View動畫REM
- JavaScript 頁面跳轉效果JavaScript
- 教你自定義Flutter錯誤頁面Flutter
- 前端頁面自定義滾動條前端
- Appfuse:新增自定義頁面元件APP元件
- 自定義處理頁面請求
- 自定義登入和登出頁面
- ThinkPHP框架中自定義錯誤頁面和提示頁面PHP框架
- 自定義react-navigation的TabBarReactNavigationtabBar