UIWindowTransitions

UIWindow 的 rootViewController 转场动画

这是一个小型项目,用于演示如何使用少量代码实现 UIWindow 的 rootViewController 转场动画。您可以在这篇文章中找到原始文章。

动机

有时在应用程序的生命周期中,您可能需要更改主 UIWindowrootViewController;一个典型的例子可能是初始引导和应用程序主页(即 UITabBarController)之间的过渡。

为了处理这个边缘情况,您可能想要创建一个顶部控制器(通常是带有不可见导航栏的 UINavigationController),它使您可以使用标准的 push 动画来 push 您的新容器。

虽然基本上它可以正常工作,但是添加一个仅用于处理此单一操作的容器有点难看。

一个更好的解决方案是将动画过渡(push/pop 或 slide)应用于 rootViewController 设置,这样您就可以获得从当前视图控制器到新视图控制器的动画切换效果。

事实上,即使它没有暴露出来,您也可以通过 CoreAnimationCATransition 非常简单地完成它。

以下代码实现了一个作为 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)

其中

以下代码使用 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'

CocoaPods

use_frameworks!
pod 'UIWindowTransitions'

Swift Package Manager

在您的 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 许可证获得许可。

关注我