切换 1.1.1

切换 1.1.1

测试已测试
语言语言 Obj-CObjective C
许可证 Apache 2
发布上次发布2017年7月

Jeff Verkoeyen维护。



切换 1.1.1

  • 作者:
  • Material Motion 作者

轻量级API,用于构建UIViewController切换。

此库标准化了iOS上构建切换的方式,因此使用一行代码即可选择想要使用的自定义切换

let viewController = MyViewController()
viewController.transitionController.transition = CustomTransition()
present(modalViewController, animated: true)
MyViewController *viewController = [[MyViewController alloc] init];
viewController.mdm_transitionController.transition = [[CustomTransition alloc] init];
[self presentViewController:viewController animated:true completion:nil];

使用此库制作切换的最简单方法是创建一个符合Transition协议的类

final class CustomTransition: NSObject, Transition {
  func start(with context: TransitionContext) {
    CATransaction.begin()

    CATransaction.setCompletionBlock {
      context.transitionDidEnd()
    }

    // Add animations...

    CATransaction.commit()
  }
}
@interface CustomTransition: NSObject <MDMTransition>
@end

@implementation CustomTransition

- (void)startWithContext:(id<MDMTransitionContext>)context {
  [CATransaction begin];
  [CATransaction setCompletionBlock:^{
    [context transitionDidEnd];
  }];

  // Add animations...

  [CATransaction commit];
}

@end

安装

使用

导入框架

@import Transitioning;

您现在将能够访问所有API。

示例应用/单元测试

通过运行以下命令,检查rep的本地副本以访问Catalog应用程序

git clone https://github.com/material-motion/transitioning-objc.git
cd transitioning-objc
pod install
open Transitioning.xcworkspace

指南

  1. 架构
  2. 如何创建一个简单的切换
  3. 如何自定义展示

架构

背景:iOS中,通过在视图控制器上设置一个transitioningDelegate来自定义切换。当一个视图控制器被展示时,UIKit将要求切换代理提供一个动画、交互和展示控制器。这些控制器随后将期望实现切换的运动。

切换在这些协议之上提供了一个薄层,具有以下优点

  • 每个视图控制器都有自己的切换控制器。这鼓励根据上下文选择切换。
  • 切换以向/后而不是从/到表示。在展示时,我们在前进。在消失时,我们在后退。这使得一致地参考切换的每一侧更容易。
  • 通过符合更多的TransitionWith*协议,切换对象可以自定义其行为。这种面向协议的设计比协议上的许多可选方法更符合Swift。
  • 但最重要的是:此库处理了基础工作,让您将重点放在动作上

如何创建一个简单的切换

在本指南中,我们将创建一个简单切换的脚手架。

第一步:定义一个新的Transition类型

过渡必须是指定NSObject类型,并且符合Transition协议。

我们预期需要实现的唯一方法是start,它会在视图控制器每次显示或消失时被调用。

final class FadeTransition: NSObject, Transition {
  func start(with context: TransitionContext) {

  }
}

步骤 2:在所有动画完成后调用完成处理程序

如果显式使用Core Animation

final class FadeTransition: NSObject, Transition {
  func start(with context: TransitionContext) {
    CATransaction.begin()

    CATransaction.setCompletionBlock {
      context.transitionDidEnd()
    }

    // Your motion...

    CATransaction.commit()
  }
}

如果使用UIView隐式动画

final class FadeTransition: NSObject, Transition {
  func start(with context: TransitionContext) {
    UIView.animate(withDuration: context.duration, animations: {
      // Your motion...

    }, completion: { didComplete in
      context.transitionDidEnd()
    })
  }
}

步骤 3:实现动画

有了基本支架,你现在可以来实现你的动画了。

如何自定义展示

当你需要执行以下操作时,你可以自定义过渡的展示:

  • 添加视图,例如遮挡视图,这些视图在过渡的生命周期之外仍然存在。
  • 改变被展示的视图控制器的目标帧。

步骤 1:继承自UIPresentationController

你必须继承UIPresentationController以实现自定义行为。如果你的过渡使用者的任何展示行为都可以自定义,你将想要定义一个自定义初始化器。

注意:避免在展示控制器中存储过渡上下文。展示控制器会一直存活,直到其关联的视图控制器被销毁,而过渡上下文只在过渡活跃期间才有效。每个展示和消失都会有自己的唯一的过渡上下文。如果在展示控制器中存储上下文,上下文的存在时间会比它原本设置的要长。

重写你的动作用到的任何UIPresentationController方法。

final class MyPresentationController: UIPresentationController {
}

步骤 2:在你的过渡中实现TransitionWithPresentation

这确保了你的过渡实现了需要的展示方法。

只有当你从defaultModalPresentationStyle方法返回.custom以及从presentationController方法返回非空UIPresentationController子类时,展示才会被自定义。

extension VerticalSheetTransition: TransitionWithPresentation {
  func defaultModalPresentationStyle() -> UIModalPresentationStyle {
    return .custom
  }

  func presentationController(forPresented presented: UIViewController,
                              presenting: UIViewController,
                              source: UIViewController?) -> UIPresentationController? {
    return MyPresentationController(presentedViewController: presented, presenting: presenting)
  }
}

可选步骤 3:在你的展示控制器中实现过渡

如果你的展示控制器需要动画,你可以实现Transition协议,以便在每次过渡开始时收到一个start调用。展示控制器的start会在过渡的start之前被调用。

注意:你的展示控制器和你的过渡可能有不同的想法,关于过渡何时完成,所以考虑哪个对象应该负责调用transitionDidEnd。通常,调用这个方法的对象是过渡对象本身。

extension MyPresentationController: Transition {
  func start(with context: TransitionContext) {
    // Your motion...
  }
}

贡献

我们欢迎贡献!

查看我们的即将到来的里程碑

更多关于我们的团队我们的社区和我们的贡献力量指南的信息。

许可

基于Apache 2.0许可证。详细信息请参阅LICENSE。