TransitionAnimation 6.0.0

TransitionAnimation 6.0.0

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布上次发布2018年12月
SPM支持 SPM

DianQK 维护。




TransitionTreasury

TransitionTreasury 是一个 Swift 中的 viewController 过渡框架。

您可以在 http://transitiontreasury.com 查看

功能

  • 推送 & 演示 & TabBar 过渡动画
  • 轻松创建过渡 & 扩展
  • 支持完成回调
  • 支持模态 ViewController 数据回调
  • 支持自定义过渡
  • 支持更新状态栏样式
  • 支持推送 & 演示 & TabBar 拖动。
  • 完整文档

迁移指南

要求

  • iOS 8.0+
  • Xcode 7.3+

通信

  • 如果您需要帮助或发现了一个错误,请提交一个issue。
  • 如果您有新的动画过渡或者想要贡献力量,请提交pull request。:)

安装

CocoaPods

CocoaPods 是用于Cocoa项目的一个依赖管理器。可以使用以下指令进行安装

$ gem install cocoapods

构建 TransitionTreasury 需要 CocoaPods 的 0.39.0+ 版本。

要使用 CocoaPods 在您的 Xcode 项目中集成 TransitionTreasury,请在您的 Podfile 中指定它

use_frameworks!
pod 'TransitionTreasury', '~> 5.0'

然后运行以下命令

$ pod install

在任何您想使用 TransitionTreasury 的文件中,请不要忘记通过 import TransitionTreasury 导入框架。

对于 TransitionAnimation 扩展,该项目将作为依赖项包含它们。您可以通过 CocoaPods 子规范来完成此操作。

pod 'TransitionAnimation', '~> 5.0'

### Carthage

Carthage 是用于Cocoa应用的分布式依赖项管理器。要安装 carthage 工具,可以使用 Homebrew

$ brew update
$ brew install carthage

要使用 Carthage 在您的 Xcode 项目中集成 TransitionTreasury,请在您的 Cartfile 中指定它

github "DianQK/TransitionTreasury"

然后运行以下命令以构建 TransitionTreasury 框架

$ carthage update

最后,您需要手动设置您的 Xcode 项目以添加 TransitionTreasury 框架。

在您的应用程序目标的 "General" 设置选项卡中,在“Linked Frameworks and Libraries”部分,从磁盘上的 Carthage/Build 文件夹拖放您想要的每个框架。

在您的应用程序目标的 "Build Phases" 设置选项卡中,点击 "+ " 图标并选择 "New Run Script Phase"。创建一个带有以下内容的 Run Script

/usr/local/bin/carthage copy-frameworks

并将您想要的框架路径添加到“Input Files”下

$(SRCROOT)/Carthage/Build/iOS/TransitionTreasury.framework
$(SRCROOT)/Carthage/Build/iOS/TransitionAnimation.framework // If need

有关如何使用 Carthage 的更多信息,请参阅其项目页面

用法

您可以查阅 示例演示
别忘了为示例执行pod install

进行推送

如果我们需要将FirstViewController推送至SecondViewController,则SecondViewController应该符合NavgationTransitionable,并添加代码var tr_pushTransition: TRNavgationTransitionDelegate?,我需要使用这个属性来保留动画对象。当然,你可以做更多事,但这很危险。

当你需要推送时,只需调用public func tr_pushViewController<T : UIViewController where T : NavgationTransitionable>(viewController: T, method: TransitionAnimationable, statusBarStyle: TransitionTreasury.TRStatusBarStyle = default, completion: (() -> Void)? = default),就像Apple的方法。关于method参数,请参阅transitiontreasury.com

示例:

/// FirstViewController.swift
class FirstViewController: UIViewController {

    func push() {
        let vc = SecondViewController()
        navigationController?.tr_pushViewController(vc, method: TRPushTransitionMethod.fade, completion: {
                print("Push finish")
            })
    }
}

/// SecondViewController.swift
class SecondViewController: UIViewController, NavgationTransitionable {

    var tr_pushTransition: TRNavgationTransitionDelegate?

    func pop() {
        tr_popViewController()
    }
}

当你需要弹出时,只需调用public func tr_popViewController(completion: (() -> Void)? = nil) -> UIViewController?

进行呈现

如果我们需要将MainViewController呈现到ModalViewController

  • MainViewController应符合ModalTransitionDelegate,并添加var tr_presentTransition: TRViewControllerTransitionDelegate?
  • ModalViewController添加weak var modalDelegate: ModalViewControllerDelegate?

示例:

/// MainViewController.swift
class MainViewController: UIViewController, ModalTransitionDelegate {

    var tr_presentTransition: TRViewControllerTransitionDelegate?

    func present() {
        let vc = ModalViewController()
        vc.modalDelegate = self // Don't forget to set modalDelegate
        tr_presentViewController(vc, method: TRPresentTransitionMethod.Fade, completion: {
                print("Present finished.")
            })
    }
}

/// ModalViewController.swift
class ModalViewController: UIViewController {

    weak var modalDelegate: ModalViewControllerDelegate?

    func dismiss() {
        modalDelegate?.modalViewControllerDismiss(callbackData: nil)
    }
}

如果你需要callbackData,你的MianViewController应该实现

func modalViewControllerDismiss(interactive interactive: Bool, callbackData data:AnyObject?)

// or

func modalViewControllerDismiss(callbackData data:AnyObject?)

interactive仅用于交互式消失,更多内容请参阅高级用法。

注意
如果你不需要callbackData,可能你没有实现func modalViewControllerDismiss(callbackData data:AnyObject?)。如果你不想使用ModalTransitionDelegate,你可以使用仅用于动画的ViewControllerTransitionable。警告
你不应该在ModalViewController中使用tr_dismissViewController()。请使用delegate。我已实现此功能,请使用modalDelegate?.modalViewControllerDismiss(callbackData: ["data":"back"])。更多信息,请阅读Dismissing a Presented View Controller

高级用法

创建你的过渡枚举(强烈推荐!)

可能如下所示

enum DemoTransition {
    case FadePush
    case TwitterPresent
    case SlideTabBar
}

extension DemoTransition: TransitionAnimationable {
    func transitionAnimation() -> TRViewControllerAnimatedTransitioning {
        switch self {
        case .FadePush:
            return FadeTransitionAnimation()
        case .TwitterPresent :
            return TwitterTransitionAnimation()
        case .SlideTabBar :
            return SlideTransitionAnimation()
        }
    }
}

然后你可以使用你的过渡,可能如下所示

tr_pushViewController(viewController: viewController, method: DemoTransition.FadePush)
tr_presentViewController(viewControllerToPresent: viewController, method: DemoTransition.TwitterPresent)

好了,你可以创建自己的动画,请参阅自定义动画

自定义动画

只需符合 TRViewControllerAnimatedTransitioning。如果你需要交互式功能,请符合 TransitionInteractiveable

关于编写自己的动画,您可以阅读 Animation-Guide,如果您愿意分享这个项目的动画,我将非常高兴。同时,请查看 TransitionTreasury/TransitionAnimation,那里有一些动画。您可以根据这些来编写。

状态栏样式

如果要更新状态栏样式,请在您的 info.plist 文件中添加键 View controller-based status bar appearance,并将其值设置为 false

然后,像在 基本用法 中一样,只需添加参数 statusBarStyle

// Push & Pop
tr_pushViewController(viewController: UIViewController, method: TRPushTransitionMethod.fade, statusBarStyle: UIStatusBarStyle = .Default)    

// Present & Dismiss
tr_presentViewController(viewControllerToPresent: UIViewController, method: TRPresentTransitionMethod.Fade, statusBarStyle: UIStatusBarStyle = .Default)

交互过渡动画

请参考 TransitionTreasuryDemo 方案

func interactiveTransition(sender: UIPanGestureRecognizer) {
        switch sender.state {
        case .Began :
            guard sender.translationInView(view).y > 0 else {
                break
            }
            let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("ModalViewController") as! ModalViewController
            vc.modalDelegate = self
            tr_presentViewController(vc, method: TRPresentTransitionMethod.Scanbot(present: sender, dismiss: vc.dismissGestureRecognizer), completion: {
                print("Present finished")
            })
        default : break
        }
    }

注意:请确保仅调用 tr_presentViewController(_:_:_:) 一次。

TabBar 动画过渡

只需添加此代码

tabBarController.tr_transitionDelegate = TRTabBarTransitionDelegate(method: TRTabBarTransitionDelegate.Slide)

注意:如果您需要 delegate,请使用 tr_delegate

您可以在 Demo/TabBarDemo 中看到。

许可

TransitionTreasury 在 MIT 许可下发布。有关详细信息,请参阅 LICENSE。