【问题标题】:Gesture-driven custom transition between UIViewControllers with different interface orientations具有不同界面方向的 UIViewController 之间的手势驱动自定义转换
【发布时间】:2023-03-26 11:44:01
【问题描述】:

问题

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

详情

我希望实现一种手势驱动的过渡,类似于库存 iPhone 相机应用程序中的过渡。在这里,您可以通过将照片拖到屏幕底部来离开图库,一旦拖到足够远,抬起手指即可关闭图库。

我在网络上找到了许多解释如何实现此行为的资源,我认为最突出的解决方案如下:

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

  2. UIViewController(即画廊)与.modalPresentationStyle = .overFullScreen 一起呈现,并再次使用UIPanGestureRecognizer 根据需要应用位置和大小更改。然后可以在平移手势结束时触发关闭动画。

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

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

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

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

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

override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .portrait }

【问题讨论】:

    标签: ios uiviewcontroller


    【解决方案1】:

    您不应阻止“相机”屏幕旋转。而是防止相机的视图旋转。看看这个答案:https://stackoverflow.com/a/38874886/4637398

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-02
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多