我感兴趣的是一个简洁的例子,介绍如何创建一个NSObject子类,实现UIViewControllerInteractiveTransitioning协议来管理两个UIViewController之间的自定义交互转换.理想情况下,这是对滑动手势的回应.类似于iOS7默认交互滑动的东西,现在有UINavigationController,但这是一个自定义/手动实现的例子.

我读过文件:

并看了其他地方的一些例子:

  • one
  • two
  • three
  • four(我设置了这个,但更多的是UIViewController containment和手动实现这些转换,而不是UIViewControllerInteractiveTransitioning

文档相当清晰,但没有参考示例代码.这些例子还有一点不尽如人意(关于不同部分是如何连接在一起的,尚未回答的问题).

所以我的问题是:

  1. 有人能帮你填写一下如何将手势(例如,滑动)绑定到实现UIViewControllerInteractiveTransitioning协议的对象上吗?
  2. 实现UIViewControllerInteractiveTransitioning协议的对象与实现UIViewControllerImagedTransitioning协议的对象之间有什么关系?似乎你必须两者兼得才能触发互动转换...

提前谢谢...

推荐答案

1)将手势与UIViewControllerInteractiveTransitioning对象绑定的最简单方法是将其设为UIPercentDrivenInteractiveTransition的子类.然后,在实现手势处理程序的地方,这里调用updateInteractiveTransition:,并给出代码示例:

-(void)handlePinch:(UIPinchGestureRecognizer *)pinch {

    CGFloat scale = pinch.scale;
    switch (pinch.state) {
      case UIGestureRecognizerStateBegan: {
          _startScale = scale;
          self.interactive = YES;
          [self.navigationController popViewControllerAnimated:YES];
          break;
      }
      case UIGestureRecognizerStateChanged: {
          CGFloat percent = (1.0 - scale/_startScale);
          [self updateInteractiveTransition:(percent < 0.0) ? 0.0 : percent];
          break;
      }
      case UIGestureRecognizerStateEnded: {
          CGFloat percent = (1.0 - scale/_startScale);
          BOOL cancelled = ([pinch velocity] < 5.0 && percent <= 0.3);
          if (cancelled) [self cancelInteractiveTransition];
          else [self finishInteractiveTransition];
          break;
      }
      case UIGestureRecognizerStateCancelled: {
          CGFloat percent = (1.0 - scale/_startScale);
          BOOL cancelled = ([pinch velocity] < 5.0 && percent <= 0.3);
          if (cancelled) [self cancelInteractiveTransition];
          else [self finishInteractiveTransition];
          break;
      }
    }
}

这个代码来自https://www.captechconsulting.com/blogs/ios-7-tutorial-series-custom-navigation-transitions--more

2) UIViewControllerAnimatedTransitioning的功能animateTransition用于执行交互转换.由于您之前拨打updateInteractiveTransition,它会自动在"关键帧"中进行分区.但是我想,如果你实现了UIViewControllerInteractiveTransitioningstartInteractiveTransition:方法(因此不使用UIPercentDrivenInteractiveTransition子类),那么你就有责任管理完全的转换(不确定这一点……抱歉,我认为文档不是很清楚).

Objective-c相关问答推荐

Objective-C NSMutableArray 在枚举时发生了变异?

如何复制 .xib 文件?

在 Objective-C 中定义协议的类别?

iOS 块和对自身的强/弱引用

自动属性合成 (@property) 和继承

在 UILabel.attributedText *not* 蓝色和 *not* 下划线

使用 NSMutableArray 的二维数组

Objective-C 的 Eclipse 插件?

UIRefreshControl - 在 iOS 7 中 pull 刷新

iOS NSLayoutConstraint 使用 constraintWithItem 固定宽度

UILabel 的角半径属性在 iOS 7.1 中不起作用

设置数据后调整 UICollectionView 单元格的大小

如何使用 iOS 创建一个大的红色 UIButton?

强制iOS应用程序崩溃的最快方法是什么?

Cocoapods ld:找不到-lPods-Projectname 的库

100% 不透明度 UILabel 超过 50% 不透明度背景(UIView?)

iPhone UILabel 文字软阴影

如何在 Cocoa 中获取当前日期

如何定义 UIColor 的常量值?

如何在 iPhone SDK 中包含和使用新字体?