2017-06-03 22 views
5

Tôi đang cố tạo hiệu ứng chuyển tiếp trên UITabBarController hơi giống với ứng dụng Facebook. Tôi quản lý để có được một "hiệu ứng cuộn" làm việc trên chuyển đổi tab, nhưng tôi không thể có vẻ để tìm ra cách để vượt qua hòa tan (hoặc nó không hoạt động ít nhất).Làm cách nào để tạo hiệu ứng chuyển đổi tab thanh tab bằng chuyển đổi trượt CrossDissolve?

Đây là mã hiện tại của tôi:

import UIKit 

class ScrollingTabBarControllerDelegate: NSObject, UITabBarControllerDelegate { 
    func tabBarController(_ tabBarController: UITabBarController, animationControllerForTransitionFrom fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? { 

     return ScrollingTransitionAnimator(tabBarController: tabBarController, lastIndex: tabBarController.selectedIndex) 
    } 
} 

class ScrollingTransitionAnimator: NSObject, UIViewControllerAnimatedTransitioning { 
    weak var transitionContext: UIViewControllerContextTransitioning? 
    var tabBarController: UITabBarController! 
    var lastIndex = 0 

    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { 
     return 0.2 
    } 

    init(tabBarController: UITabBarController, lastIndex: Int) { 
     self.tabBarController = tabBarController 
     self.lastIndex = lastIndex 
    } 

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { 
     self.transitionContext = transitionContext 

     let containerView = transitionContext.containerView 
     let fromViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from) 
     let toViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to) 

     containerView.addSubview(toViewController!.view) 

     var viewWidth = toViewController!.view.bounds.width 

     if tabBarController.selectedIndex < lastIndex { 
      viewWidth = -viewWidth 
     } 

     toViewController!.view.transform = CGAffineTransform(translationX: viewWidth, y: 0) 

     UIView.animate(withDuration: self.transitionDuration(using: (self.transitionContext)), delay: 0.0, usingSpringWithDamping: 1.2, initialSpringVelocity: 2.5, options: .transitionCrossDissolve, animations: { 
      toViewController!.view.transform = CGAffineTransform.identity 
      fromViewController!.view.transform = CGAffineTransform(translationX: -viewWidth, y: 0) 
     }, completion: { _ in 
      self.transitionContext?.completeTransition(!self.transitionContext!.transitionWasCancelled) 
      fromViewController!.view.transform = CGAffineTransform.identity 
     }) 
    } 
} 

Sẽ là tuyệt vời nếu có ai biết làm thế nào để có được điều này để làm việc, đã cố gắng trong nhiều ngày nay mà không có sự tiến bộ ...:/

EDIT: tôi đã một chéo hòa tan làm việc bằng cách thay thế các khối UIView.animate với:

UIView.transition(with: containerView, duration: 0.2, options: .transitionCrossDissolve, animations: { 

    toViewController!.view.transform = CGAffineTransform.identity 
    fromViewController!.view.transform = CGAffineTransform(translationX: -viewWidth, y: 0) 

}, completion: { _ in 

    self.transitionContext?.completeTransition(!self.transitionContext!.transitionWasCancelled) 
    fromViewController!.view.transform = CGAffineTransform.identity 

}) 

Tuy nhiên, hoạt ảnh thực sự tụt hậu và không thể sử dụng được: (

Trả lời

11

Có cách đơn giản hơn để thực hiện việc này. Thêm mã sau vào ủy nhiệm thanh tab:

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool { 

    if selectedViewController == nil || viewController == selectedViewController { 
     return false 
    } 

    let fromView = selectedViewController!.view 
    let toView = viewController.view 

    UIView.transition(from: fromView!, to: toView!, duration: 0.3, options: [.transitionCrossDissolve], completion: nil) 

    return true 
} 
+0

Cảm ơn, công trình này và sạch hơn và ít mã hơn! Bất kỳ cách nào để làm cho các slide hoạt hình cùng một lúc? (Tôi đang tìm một sự kết hợp của hai) – JoniVR

+0

@JoniVR Tôi đã không thử, nhưng bạn có thấy rằng các tùy chọn là một loạt các tùy chọn, bạn đã thử thêm một số khác trong đó để xem nếu nó hoạt động? – gmogames

+0

Có, tôi đã thử tất cả, dường như không phải là một lựa chọn cho điều đó như xa như tôi có thể nói, vì vậy nó có lẽ sẽ được với một hình ảnh động tùy chỉnh như tôi đã cố gắng trước đó, phải không? – JoniVR

Các vấn đề liên quan