TransitionTreasury 是一个使用 Swift 编写的 viewController 切换框架。
http://transitiontreasury.com
您可以查看功能
- Push & Present & TabBar 切换动画
- 轻松创建切换和扩展
- 支持完成回调
- 支持模态 viewController 数据回调
- 支持自定义切换
- 支持更新状态栏样式
- 支持 Push & Present & 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 将 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 的更多信息,请参阅其 项目页面。
用法
进行推送
如果我们需要将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。