如何在两个UIViewControllers
之间实现自定义手势驱动的转换,其中初始视图控制器支持多个接口方向,但最终视图控制器仅限于.portrait
?
我希望实现一个手势驱动的过渡,类似于iPhone相机应用程序中的一个。在这里,你可以通过将照片拖到屏幕底部离开画廊,一旦拖得足够远,就可以通过抬起手指来解除画廊。
我在网上发现了很多解释如何实现这种行为的来源,我认为最突出的解决方案如下:
自定义动画的子类UIViewControllerAnimatedTransitioning
,并使用UIPercentDrivenInteractiveTransition
和UIPanGestureRecognizer
控制它。
使用UIViewController
展示孩子.modalPresentationStyle = .overFullScreen
(即图库),并再次使用UIPanGestureRecognizer
根据需要应用位置和尺寸更改。然后可以在平移手势结束时触发关闭动画。
我的问题是,当子视图控制器和父视图控制器具有不同的方向时,这两种方法都会失败。这也是使用相机应用程序的最佳解释:在相机视图(父视图)中,手机从纵向旋转到横向不会重新排列整个UI,而只会旋转某些按钮。我需要类似的行为,并通过覆盖supportedInterfaceOrientations
来返回.portrait
来实现此目的。但是,图库视图 会根据方向重新排列其UI,因此supportedInterfaceOrientations
不会限制子视图。
因此,在股票应用程序中,我可以很好地将手机旋转到横向,并仍然使用手势来关闭图库,在我的实现中,这会以下列方式失败:
对于第一种方法,UIPanGestureRecognizer
几乎立即将其状态更改为ended
,取消动画并使我的UI处于稍微未定义的状态,两个视图控制器都可见。
在第二种方法中,父视图控制器仍然控制设备方向,不允许孩子将其UI重新排列为横向模式。
想知道现有的框架是否有类似的问题,我偶然发现Hero Library,如果在应用程序中激活了横向方向,我的案例1可以从an example完美再现em>部署信息,通过将此块添加到类FirstViewController
,第一个视图控制器被锁定为纵向模式。
override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .portrait }
答案 0 :(得分:0)
您不应该阻止“相机”屏幕旋转。相反,防止相机的旋转视图。请查看此答案:https://stackoverflow.com/a/38874886/4637398
以下是我的相机布局粗略副本的演示(可能不是最清晰的视图旋转阻止实现):https://www.dropbox.com/s/wqheb9i6mk6bql3/Camera-like.zip?dl=0