UIWindow 的 rootViewController 转场动画
这是一个小型项目,用于演示如何使用少量代码实现 UIWindow 的 rootViewController
转场动画。您可以在这篇文章中找到原始文章。
有时在应用程序的生命周期中,您可能需要更改主 UIWindow
的 rootViewController
;一个典型的例子可能是初始引导和应用程序主页(即 UITabBarController
)之间的过渡。
为了处理这个边缘情况,您可能想要创建一个顶部控制器(通常是带有不可见导航栏的 UINavigationController
),它使您可以使用标准的 push 动画来 push 您的新容器。
虽然基本上它可以正常工作,但是添加一个仅用于处理此单一操作的容器有点难看。
一个更好的解决方案是将动画过渡(push/pop 或 slide)应用于 rootViewController
设置,这样您就可以获得从当前视图控制器到新视图控制器的动画切换效果。
事实上,即使它没有暴露出来,您也可以通过 CoreAnimation
和 CATransition
非常简单地完成它。
以下代码实现了一个作为 UIWindow
类的扩展的新函数;它接受两个参数:目标控制器和选项。
正如您可能想象的那样,目标控制器是您想要设置为新的 rootViewController
的控制器,而 options 是一个用于对一些典型的 CoreAnimation 设置进行分组的结构体:动画方向(pop/push/从顶部或底部滑动)、动画曲线(linear、ease in/out)、动画持续时间(默认值为 0.25 秒)以及一个可选的 UIView 实例,用于在新旧视图之间进行淡入/淡出。
1.0.0 版本修复了一个与 iOS 相关的问题,该问题目前在 radar 中被公开。此修复由 voltbank 在他的仓库 ReplaceRootViewController 中创建,该仓库是从本项目 fork 而来的。
嗨,开发者同仁!
您知道,维护和开发工具需要资源和时间。虽然我喜欢制作它们,但您的支持对于我继续开发至关重要。
如果您正在使用 SwiftLocation 或我的任何其他作品,请考虑以下选项
一旦实现,您就可以使用暴露给所有 UIWindow 实例的唯一函数,名为
func set(rootViewController newRootViewController: UIViewController, options: TransitionOptions = TransitionOptions(), _ completion:((Bool) -> Void)? = nil)
其中
controller
:要设置为新的 rootViewController
的目标视图控制器options
:具有以下属性的 TransitionOptions
duration
:动画的持续时间(以 TimeInterval
,秒为单位表示,默认值为 0.25
)direction
:过渡方向(toRight
、toLeft
、toTop
、toBottom
,默认值为 .toRight
)style
:动画曲线(linear
、easeIn
、easeOut
、easeInOut
,默认值为 .linear
)background
:为淡入淡出到旧/新控制器而设置的背景视图(默认值为 nil
)。completion
:完成回调,用于在过渡完成时接收信息。以下代码使用 0.4 秒的 ease out - slide up 动画更改 rootViewController
。
let wnd = UIApplication.shared.keyWindow
var options = UIWindow.TransitionOptions()
options.direction = .toTop
options.duration = 0.4
options.style = .easeOut
wnd?.set(rootViewController(newVC, options: options)
如果您只需要一个简单的 push(像 UINavigationController
的 push),您可以不使用 options
参数调用它
wnd?.set(rootViewController(newVC)
以下演示在项目的演示应用程序中可用。
您可以使用 CocoaPods、Carthage 和 Swift 包管理器安装 UIWindowTransitions
pod 'UIWindowTransitions'
use_frameworks!
pod 'UIWindowTransitions'
在您的 Package.swift
中添加 UIWindowTransitions 作为依赖项
import PackageDescription
let package = Package(name: "YourPackage",
dependencies: [
.Package(url: "https://github.com/malcommac/UIWindowTransitions.git", majorVersion: 0),
]
)
UIWindowTransitions 目前由 Daniele Margutti 拥有和维护。
您可以在 Twitter 上关注我 @danielemargutti。
我的网站是 https://www.danielemargutti.com
本软件根据 MIT 许可证获得许可。
关注我