【发布时间】:2023-03-26 11:44:01
【问题描述】:
问题
如何实现两个UIViewControllers 之间的自定义手势驱动转换,其中初始视图控制器支持多种界面方向,但最终视图控制器仅限于.portrait?
详情
我希望实现一种手势驱动的过渡,类似于库存 iPhone 相机应用程序中的过渡。在这里,您可以通过将照片拖到屏幕底部来离开图库,一旦拖到足够远,抬起手指即可关闭图库。
我在网络上找到了许多解释如何实现此行为的资源,我认为最突出的解决方案如下:
自定义动画的子类
UIViewControllerAnimatedTransitioning并使用UIPercentDrivenInteractiveTransition和UIPanGestureRecognizer控制它。将
UIViewController(即画廊)与.modalPresentationStyle = .overFullScreen一起呈现,并再次使用UIPanGestureRecognizer根据需要应用位置和大小更改。然后可以在平移手势结束时触发关闭动画。
我的问题是,当子视图控制器和父视图控制器具有不同的方向时,这两种方法都会失败。再一次,最好用股票相机应用程序来解释:在相机视图(父视图)中,手机从纵向到横向的旋转不会重新排列整个 UI,而只会旋转一些按钮。我需要类似的行为,并通过覆盖supportedInterfaceOrientations 以返回.portrait 来实现这一点。但是,图库视图确实根据方向重新排列其 UI,因此 supportedInterfaceOrientations 不受子视图的限制。
因此,在股票应用程序中,我可以很好地将手机旋转为横向,并且仍然使用手势来关闭图库,在我的实现中,这会以以下方式失败:
对于第一种方法,
UIPanGestureRecognizer几乎立即将其状态更改为ended,取消动画并使我的 UI 处于某种未定义的状态,同时两个视图控制器都可见。在第二种方法中,父视图控制器保持对设备方向的控制,不允许子视图将其 UI 重新排列为横向模式。
想知道现有框架是否存在类似问题,我偶然发现了Hero Library,如果在应用程序的部署信息中激活横向方向,我的案例1可以从an example完美复制,并且通过将此块添加到类FirstViewController,将第一个视图控制器锁定为纵向模式。
override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .portrait }
【问题讨论】:
标签: ios uiviewcontroller