TransitionTreasury 6.0.0

TransitionTreasury 6.0.0

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

DianQK 维护。




TransitionTreasury

TransitionTreasury 是一个使用 Swift 编写的 viewController 切换框架。

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

功能

  • Push & Present & TabBar 切换动画
  • 轻松创建切换和扩展
  • 支持完成回调
  • 支持模态 viewController 数据回调
  • 支持自定义切换
  • 支持更新状态栏样式
  • 支持 Push & Present & TabBar 手势。
  • 完整文档

迁移指南

要求

  • iOS 8.0+
  • Xcode 7.3+

通讯

  • 如果您需要帮助或发现了一个错误,请打开一个issue。
  • 如果您有一个新的过渡动画或有意愿贡献,请提交一个pull request。 :]

安装

CocoaPods

CocoaPods 是 Cocoa 项目的依赖管理器。您可以使用如下命令安装它:

$ gem install cocoapods

要构建 TransitionTreasury,需要 CocoaPods 0.39.0+。

使用 CocoaPods 将 TransitionTreasury 集成到您的 Xcode 项目中,请在其 Podfile 中指定它:

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

然后,运行以下命令:

$ pod install

在任何您希望使用 TransitionTreasury 的文件中,不要忘记使用 import TransitionTreasury 导入框架。

对于 TransitionAnimation 扩展,此项目会将它们作为依赖项包含在内。您可以通过 CocoaPods subspecs 实现这一点。

pod 'TransitionAnimation', '~> 5.0'

### Carthage

Carthage 是 Cocoa 应用程序的分散式依赖管理器。要安装 carthage 工具,您可以使用 Homebrew

$ brew update
$ brew install carthage

使用 Carthage 将 TransitionTreasury 集成到您的 Xcode 项目中,请在其 Cartfile 中指定它:

github "DianQK/TransitionTreasury"

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

$ carthage update

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

在您的应用程序目标的“常规”设置标签页中,“链接的框架和库”部分,从磁盘上的 Carthage/Build 文件夹拖放您希望使用的每个框架。

在您的应用程序目标的“构建阶段”设置标签页中,点击“+”图标并选择“新的运行脚本阶段”。创建一个包含以下内容的运行脚本:

/usr/local/bin/carthage copy-frameworks

并在“输入文件”下添加您希望使用的框架路径。

$(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"])。更多内容请参考解散已呈现的视图控制器

高级用法

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

可能像这样

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

关于编写自己的动画,你可以阅读 动画指南,如果你愿意为这个项目分享你的动画,我会很高兴。另外,查看 TransitionTreasury/TransitionAnimation,那里有一些动画。你可以遵循这个来编写。

状态栏样式

如果你想要更新状态栏样式,应在你的 info.plist 中添加键 基于视图控制器状态栏外观,并将其值设置为 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 Scheme

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)

注意:如果你需要 代理,请使用 tr_delegate

你可以查看 Demo/TabBarDemo

授权许可

TransitionTreasury 遵循 MIT 授权许可发布。有关详细信息,请参阅 LICENSE。