为 UIWindow 添加动画过渡效果
这是一个小型项目,用它演示如何用一小段代码实现 UIWindow 的 rootViewController
过渡。您可以在这里找到该文章的原始版本。
动机
在某些情况下,您可能需要在应用程序的生命周期中更改主 UIWindow
的 rootViewController
,一个典型的例子可能是从初始引导程序到应用程序首页(例如,一个 UITabBarController
)的过渡。
为了处理这种边缘情况,您可能想要创建一个顶级控制器(通常是一个带有不可见导航栏的 UINavigationController
),这样您就可以使用标准推动动画将新容器推入。
虽然这种方式基本可行,但仅为了处理这个单一操作而添加容器,看起来有点糟糕。
更好的解决方案是对设置的 rootViewController
应用动画过渡(推动/弹回或滑动),从而从当前视图控制器到新视图控制器进行平滑的动画切换。
实际上,即使是未公开的,您可以使用 CoreAnimation
和 CATransition
来实现这一点,并且非常简单。
以下代码是作为 UIWindow
类的扩展实现的新功能;它接受两个参数:目标控制器和选项。
如你所想,目标控制器是你想要设置为新的 rootViewController
的控制器,而选项是用于分组一些典型的 CoreAnimation 设置的结构:动画方向(从顶部或底部推动/弹回)、动画曲线(线性、 ease in/out)、动画持续时间(默认为 0.25s)以及用于在旧视图和新视图之间淡入/淡出的可选 UIView
实例。
已知问题及修复
1.0.0 修复了 iOS 目前在 这里 打开的 issue。这个修复由 voltbank 在他的 repository(从该项目分叉而来 ReplaceRootViewController)中创建。
❤️ 您的支持
您好,开发者朋友!
维护和开发工具需要消耗资源和时间。虽然我喜欢制作它们,但您的支持是我继续其开发的关键。
如果您正在使用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秒的淡出滑动动画更改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)
如果您只需要简单的推送(如UINavigationController
的推送),您可以在没有options
参数的情况下调用它。
wnd?.set(rootViewController(newVC)
示例应用
以下示例可在项目的示例应用程序内找到。
安装
您可以使用CocoaPods、Carthage和Swift包管理器安装UIWindowTransitions。
pod 'UIWindowTransitions'
CocoaPods
use_frameworks!
pod 'UIWindowTransitions'
Swift软件包管理器
在您的Package.swift
中将UIWindowTransitions添加为依赖项
import PackageDescription
let package = Package(name: "YourPackage",
dependencies: [
.Package(url: "https://github.com/malcommac/UIWindowTransitions.git", majorVersion: 0),
]
)
贡献
- 如果您需要帮助或想提出一般性问题,请创建一个issue。
- 如果您发现了一个bug,请创建一个issue。
- 如果您有一个功能请求,请创建一个issue。
- 如果您想贡献,请提交一个pull request。
版权与致谢
UIWindowTransitions 目前由 Daniele Margutti 拥有并维护。
您可以在Twitter上关注我 @danielemargutti。
我的网站是 https://www.danielemargutti.com
此软件遵循 MIT 许可证。
关注我