具有不同界面方向的UIViewControllers之间的手势驱动的自定义转换

时间:2018-01-16 13:01:59

标签: ios uiviewcontroller

问题

如何在两个UIViewControllers之间实现自定义手势驱动的转换,其中初始视图控制器支持多个接口方向,但最终视图控制器仅限于.portrait

详细

我希望实现一个手势驱动的过渡,类似于iPhone相机应用程序中的一个。在这里,你可以通过将照片拖到屏幕底部离开画廊,一旦拖得足够远,就可以通过抬起手指来解除画廊。

我在网上发现了很多解释如何实现这种行为的来源,我认为最突出的解决方案如下:

  1. 自定义动画的子类UIViewControllerAnimatedTransitioning,并使用UIPercentDrivenInteractiveTransitionUIPanGestureRecognizer控制它。

  2. 使用UIViewController展示孩子.modalPresentationStyle = .overFullScreen(即图库),并再次使用UIPanGestureRecognizer根据需要应用位置和尺寸更改。然后可以在平移手势结束时触发关闭动画。

  3. 我的问题是,当子视图控制器和父视图控制器具有不同的方向时,这两种方法都会失败。这也是使用相机应用程序的最佳解释:在相机视图(父视图)中,手机从纵向旋转到横向不会重新排列整个UI,而只会旋转某些按钮。我需要类似的行为,并通过覆盖supportedInterfaceOrientations来返回.portrait来实现此目的。但是,图库视图 会根据方向重新排列其UI,因此supportedInterfaceOrientations不会限制子视图。

    因此,在股票应用程序中,我可以很好地将手机旋转到横向,并仍然使用手势来关闭图库,在我的实现中,这会以下列方式失败:

    1. 对于第一种方法,UIPanGestureRecognizer几乎立即将其状态更改为ended,取消动画并使我的UI处于稍微未定义的状态,两个视图控制器都可见。

    2. 在第二种方法中,父视图控制器仍然控制设备方向,不允许孩子将其UI重新排列为横向模式。

    3. 想知道现有的框架是否有类似的问题,我偶然发现Hero Library,如果在应用程序中激活了横向方向,我的案例1可以从an example完美再现em>部署信息,通过将此块添加到类FirstViewController,第一个视图控制器被锁定为纵向模式。

      override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .portrait }
      

1 个答案:

答案 0 :(得分:0)

您不应该阻止“相机”屏幕旋转。相反,防止相机的旋转视图。请查看此答案:https://stackoverflow.com/a/38874886/4637398

以下是我的相机布局粗略副本的演示(可能不是最清晰的视图旋转阻止实现):https://www.dropbox.com/s/wqheb9i6mk6bql3/Camera-like.zip?dl=0