TransitionTreasury 是一个 Swift 中的 viewController 过渡框架。
http://transitiontreasury.com 查看
您可以在功能
- 推送 & 演示 & TabBar 过渡动画
- 轻松创建过渡 & 扩展
- 支持完成回调
- 支持模态 ViewController 数据回调
- 支持自定义过渡
- 支持更新状态栏样式
- 支持推送 & 演示 & TabBar 拖动。
- 完整文档
迁移指南
- [TransitionTreasury 3.0 迁移指南](https://github.com/DianQK/TransitionTreasury/blob/master/Documentation/TransitionTreasury 3.0 Migration Guide.md)
要求
- 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 的更多信息,请参阅其项目页面。
用法
进行推送
如果我们需要将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。