NGSRouter
描述
NGSRouter 是一款轻量级的页面过渡库,使得页面之间的过渡变得简单,只需要几行代码即可。
安装
CocoaPods
添加到您的 podfile 中
pod "NGSRouter", "~> 1.0.0"
示例
- 演示项目: iOS 示例
关于 NGSRouter
NGSRouter 可与 Storyboard
、.xib
和基于代码的视图控制器一起工作。
对于导航,您可以使用基本的 NGSRouter
实现并选择更适合的功能。您可以更改过渡流程,自定义您的方式。
如何使用
例如,我们将完成两个页面之间的切换
import NGSRouter
// MARK: - The first view controller.
final class ViewController: UIViewController {
// This property contain protocol protected view controller for transition.
private lazy var router = NGSRouter(transitionHandler: self)
@IBAction func onOpenPage(_ sender: UIButton) {
router.navigate(
to: DestinationViewController.self,
typeNavigation: .push,
animated: true
)
}
}
// MARK: - The destination view controller.
final class DestinationViewController: UIViewController, NGSNavigatable {
func prepare() {
// configure page here. This function call by router before navigation
}
}
在这种情况下,您会创建视图控制器之间的默认过渡并自定义目标视图控制器。但在导航执行之前,您必须在系统中注册导航
// 1. Register storyboard id factory
NGSRouterConfig.shared.registerStoryboardIdFactory(factory: NGSViewControllerStoryboardIdFactory())
// 2. Register navigation
NGSRouterAssember.default.register(
DestinationViewController.self,
storyboard: Storyboard.main
)
/// and etc..
其中 Storyboard
是项目中实现 NGSStoryboard
的枚举。
注意❗️ 如果您使用 storyboard 导航,则您的 storyboardId
应遵循以下规则
基于视图控制器:从 className 中切出 ViewController
className:DestinationViewController
-> storyboardId Destination
基于演示者:从 className 中切出 Presenter
className:DestinationPresenter
-> storyboardId Destination
您还可以通过实现协议 NGSStoryboardIdFactory
来创建自己的 storyboardId 工厂。
过渡情况
例如,我们用不同类型的导航分析以下代码
- 简单导航
- 带参数的导航
- 带关闭参数的导航
- 结合使用
简单导航(NGSNavigatable)
这是默认情况,使用默认的 NGSRouter 实现。如果您只需要显示新页面,那么请使用它。
示例
在目标类中实现 NGSParamNavigatable
final class DestinationViewController: UIViewController, NGSNavigatable {
func prepare() {
// configure page here. This function call by router before navigation
}
}
进行导航
router.navigate(
to: DestinationViewController.self,
typeNavigation: .modal,
animated: true
)
带参数的导航(NGSParamNavigatable)
有时在程序中,您需要将一些数据传递给下一个屏幕,但在默认实现中,它可能有点冗长。NGSRouter 提供了一种灵活的方式,让您以极短的方式完成此操作。
示例
在目标类中实现 NGSParamNavigatable
final class DestinationViewController: UIViewController, NGSParamNavigatable {
func prepare() {
// configure page here. This function call by router before navigation
}
func prepare(parameter: String) {
// you receive parameter here. Pay attention that this function is called before navigation.
}
}
进行导航
_router.navigate(
to: DestinationViewController.self,
parameter: "Target text",
typeNavigation: .modal,
animated: true
)
带关闭参数的导航(NGSParamNavigatable)
有时在程序中,您需要将一些数据传递给上一个屏幕(例如,从输入视图控制器返回数据)。NGSRouter 提供了一种灵活的方式,让您以极短的方式完成此操作。
示例
在目标类中实现 NGSCloseNavigatable
final class DestinationViewController: UIViewController, NGSParamNavigatable {
func prepare() {
// configure page here. This function call by router before navigation
}
// Special object to return data to the previous screen. Set here appropriate type
var closableObject = NGSCloseObject<String>()
// close current
func closeScreen(parameter: String) {
_router.close(target: self, parameter: parameter, animated: true)
}
}
进行导航
_router.navigate(
to: DestinationViewController.self,
typeNavigation: .modal,
animated: true,
closeCompletion: { parameter in
// you receive close parameter here
}
)
结合使用
如果您需要传递参数并接收关闭参数,您应该在目标类中实现这两个协议或使用特殊的 typealias NGSParamCloseNavigatable
。
如果不需要为目标屏幕传递参数,但目标屏幕实现了特殊协议,则可以改用用于简单导航的功能,代替使用带有参数的导航功能。
自定义过渡
要自定义过渡,可以更改过渡演示并设置动画。
动画过渡
此参数可以动画化当前的过渡效果。在一个导航函数中将=animated
设置为适当的值。
更改演示文稿
参数 typeNavigation
负责更改演示文稿样式。它与 UINavigationController
、UISplitViewController
、ModalPresentation
和默认演示文稿一起工作。
- 默认样式 (
push
、modal
、crossDisolve
、formSheet
)
- 导航样式 (
push
、pop
、present
)typeNavigation: .custom(.navigation(style: NavigationStyle))
- 分割样式 (
detail
、default
)typeNavigation: .custom(.split(style: SplitStyle))
- 模态样式 (
UIModalTransitionStyle
、UIModalPresentationStyle
- 标准 UIKit 演示文稿样式。)typeNavigation: .custom(style: .modal(transition: UIModalTransitionStyle, presentation: UIModalPresentationStyle))
配置目标控制器
所有导航都需要在使用先前进行一次注册。您可以在 AppDelegate
或您的 Coordinator
或 Assembler
中执行此操作,这并不重要,但您必须在进行导航之前注册它,否则您将收到致命错误。
在 Storyboard 中注册有视图的视图控制器
NGSRouterAssember.default.register(
DestinationViewController.self,
storyboard: Storyboard.main
) { (vc: DestinationViewController) in
// configure target vc if needed
}
通过 .xib 或代码注册视图控制器
NGSRouterAssember.default.register(
DestinationViewController.self,
factory: { DestinationViewController() }
) { (vc: DestinationViewController) in
// configure target vc if needed
}
如果不需要配置目标视图控制器,可以省略此参数。
注意
- 许可证:
MIT
- 作者:Peter Standret / [email protected]
感谢观看。