之所以写这篇介绍是希望更多人的能够了解这个库是可以在实际项目中使用的,而且使用起来并不复杂,同时又不影响业务逻辑。也希望大家能发现其中的问题,从而真的配得上 Treasury 。本文当前基于 2.0.0-beta 介绍。

项目目的

我做这个项目的目的只有两个,调用方便,写动画更方便。换句话说,就是希望项目被业务追着跑得时候,能更多注重一些交互上的体验。

项目结构

1
2
3
4
5
6
7
8
9
10
├── TransitionTreasury
├── TransitionAnimation 动画文件夹,全部的动画都在这里
├── TransitionTreasury.swift 定义动画等基本的枚举
├── TRViewControllerAnimatedTransitioning.swift 每个动画都需要服从该协议
├── UINavigationController+TRPushPop.swift 基本的 Push 调用接口
├── UIViewController+TRPresent.swift 基本的 Present 调用接口
├── TransitionAnimationHelper.swift 一些可能用到的工具,比如使用更安全的 CAAniamtion
├── TRStatusBarStyle.swift 单独的一个小模块,处理状态栏的基本变化情况,LightContent Default Hide
├── TRNavgationTransitionDelegate.swift 处理/管理 Push 的各种委托以及管理动画
└── TRViewControllerTransitionDelegate.swift 处理/管理 Present 的各种委托以及管理动画

同时还有一张图来解释之间的逻辑关系。

如果你做过转场动画,可能会感觉到基本上每种动画代码同的地方只有这两个方法:

1
2
public func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval
public func animateTransition(transitionContext: UIViewControllerContextTransitioning)

其他的处理可能都是可复用的代码,特别是处理各种烦人的delegate关系,极大的增加了两个 ViewController 的耦合,本来 ViewController 就不短了~

其他特性

这个库主要做的事情只是 Push 和 Present ,于是下面的这些特性都是很轻量级的支持,只支持一些基本的变化,当然你也可以扩展一下,丰富一下其中的功能。

Status Bar

你可以在 TRStatusBarStyle.swift 中找到所有相关的设置。在实际使用中,状态栏是有三种状态的: DefaultLightContentHide,也就是黑色、白色,隐藏。

最初的打算是用

1
2
3
override func preferredStatusBarStyle() -> UIStatusBarStyle {
return .LightContent
}

这样的方式切换,但是当在UINavgationController下会失效,我们需要设置的UINavgationControler上的StatusBar而不是你看到的UIViewController

为了适应各种场景,推荐这个方法:

1
UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: .Fade)

详细部分你可以直接看 TRStatusBarStyle.swiftenum 真是好,切换状态什么的这么轻松就办到了,你还可以简单地对动画方式扩展。

别忘了在你的 info.plist 中添加View controller-based status bar appearance,并设置为false

Tabbar

这是一个和 Push & Present 完全不同的转场,设置风格都不一样了~