SKCustomNavigation 0.1.6

SKCustomNavigation 0.1.6

Serhii Kostian 维护。



  • Serhii Kostian

CustomNavigation

此消息将帮助您更快速地创建和集成自定义导航。

您应该怎么做?

注意:在您想要使用此 pod 中类的每个位置导入模块

安装

pod 'CustomNavigation'

1. 如何使用 CustomNavigation pod 创建自定义动画

为此,您应该创建一个新的类,继承自 CustomAnimatedTransitioning,并且当然要导入模块。
可能是这样的

import UIKit
import SKCustomNavigation

class CustomFallAnimation: NSObject, CustomAnimatedTransitioning {

var duration: TimeInterval
var reverseTransition: Bool

required init(duration: TimeInterval = 1, reverseTransition: Bool = false) {
self.duration = duration
self.reverseTransition = reverseTransition
}

// MARK: - UIViewControllerAnimatedTransitioning -

func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
返回持续时间
}

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
在此处编写过渡代码
动画完成后,别忘了调用animationFinished()。此方法将自动更改动画的 '方向'
}

reverseTransition - 值为false表示这是 '前向' 导航,反之亦然

另一种方法是继承自BaseTransition并重写3个来自TransitionProvider协议的方法。例如,可以从Transitions文件夹的文件中查看。
BaseTransition的优势在于它可以获取AnimatorProvider。您可以创建自己的AnimatorProvider或使用提供自定义初始化值的4个类之一。
创建过渡(例如推送)并放置新的AnimatorProvider,您将看到动画将如何改变。

2. 自定义推送和弹出导航

如果您想创建自定义推送/弹出导航,您应该使用NavigationController类作为导航控制器对象。此类已经实现了我们所需的所有功能。如果您已经有了自己的自定义导航控制器,请确保它继承自此pod的NavigationController类。

let navigationController = DefaultNavigationController(rootViewController: YourViewController) window?.rootViewController = navigationController

如果您想将交互(当导航控制器识别到识别右滑动手势以执行返回操作)添加到导航控制器中,您可以这样做:

navigationController.set(interactive: true)

最后,让您的UIViewController符合AnimationControllerProvider协议

class MainMenuViewController: UIViewController, MainMenuInterface, AnimationControllerProvider {
var animatedTransitioning: CustomAnimatedTransitioning? = CustomPushTransition()
}

NavigationController将自动获取动画并执行。

3. 自定义推送和消失导航

在这种情况下,您应该使用DefaultTransitioningDelegate。DefaultTransitioningDelegate包含两个属性

animatedTransitioning - 这是您的自定义动画。此值可以为nil,但您不会看到任何自定义动画
interactionController - 任何符合UIViewControllerInteractiveTransitioning的类。此值可以为nil,并且您无法通过手势与UIViewController进行交互

您已经知道了如何创建动画。至于交互器,您可以继承自UIPercentDrivenInteractiveTransition,InteractionControlling协议并编写您自己的控制器交互。

最后,当您拥有动画和,可选地,交互器时,您需要执行以下操作:

创建具有自定义动画的transitioningDelegate属性,在初始化代理的同时也可以设置交互器,如果您需要所有这些

var transitioningDelegate = DefaultTransitioningDelegate(animatedTransitioning: CustomFallAnimation())

在我这个例子中,我将在拥有我想推送的视图控制器时设置交互器。

transitioningDelegate.interactionController = PanInteractionController(viewController: viewControllerToPresent)

最后,将代理设置到将要推送的视图控制器

viewControllerToPresent.transitioningDelegate = transitioningDelegate
viewController.present(viewControllerToPresent, animated: true, completion: nil)

4. 使用UIPresentationController的自定义推送

DefaultPresentationController提供了配置将要推送的视图宽度和垂直位置的属性。
您可以创建一个继承自UIPresentationController的类,并在块中返回该类的对象。使用DefaultPresentationController的示例

创建带有动画(可选)、交互器(可选)和推送控制器提供程序的DefaultTransitioningDelegate变量

private var customTransitioningDelegate = DefaultTransitioningDelegate(presentationControllerProvider: { (presented, presenting, _) -> UIPresentationController? in let presentationController = DefaultPresentationController(presentedViewController: presented, presenting: presenting) presentationController.position.y = .bottom return presentationController })

设置modalPresentationStyle .custom并将transitioningDelegate设置到将要推送的视图控制器

viewControllerToPresent.modalPresentationStyle = .custom
viewControllerToPresent.transitioningDelegate = customTransitioningDelegate
viewController.present(viewControllerToPresent, animated: true, completion: nil)