[英]UINavigationController: show embedded view controllers with different orientations after each transition?
這是StackOverflow上的常見問題,但其他解決方案都沒有奏效。 許多人也是幾年前寫的。
以下是一些考慮的帖子:
我們在UINavigationController中嵌入了幾個視圖控制器:A,B,C,D。
A,B使用肖像。
C,D使用景觀。
A是根控制器。
假設B被推到A.這是有效的,因為B是肖像。 但是,當C被推到B上時,屏幕不會旋轉,因為類docs狀態:
通常,系統僅在窗口的根視圖控制器或呈現的視圖控制器上調用此方法以填充整個屏幕; 子視圖控制器使用由父視圖控制器為其提供的窗口部分,不再直接參與有關支持哪些旋轉的決策。
因此,在自定義UINavigationController中覆蓋supportedInterfaceOrientations
沒有幫助,因為在嵌入式控制器中的轉換時不會參考它。
實際上,我們需要一種在轉換時強制方向更改的方法,但似乎沒有支持這種方法。
這是我們如何覆蓋UINavigationController(擴展現在僅用於調試目的,因為顯然擴展不應該用於覆蓋):
extension UINavigationController {
override open var shouldAutorotate: Bool {
return true
}
override open var supportedInterfaceOrientations : UIInterfaceOrientationMask {
return visibleViewController?.supportedInterfaceOrientations ?? UIInterfaceOrientationMask.landscapeRight
}
}
在嵌入式視圖控制器中,我們嘗試設置這樣的方向:
override var shouldAutorotate: Bool {
return true
}
override var preferredInterfaceOrientationForPresentation : UIInterfaceOrientation {
return UIInterfaceOrientation.landscapeRight
}
override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.landscapeRight
}
總而言之,目標是:
1)顯示嵌入在具有不同方向的UINavigationController內的視圖控制器。
2)VC過渡應該產生適當的方向變化(例如,從C-> B彈出應該產生肖像,從D-> C彈出應該產生景觀,從B-> C推動應該產生景觀,從A-> B推出應該產生肖像)。
如果可以強制UINavigationController進入方向(使用公開支持的方法),一種可能的解決方案是在顯示新視圖控制器時強制方向。 但這似乎也不可行。
建議?
子類UINavigationController
。
class LandscapeNavigationController: UINavigationController {
public var vertical: Bool = true
override var shouldAutorotate: Bool {
get { return true }}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
get { return (vertical) ? .portrait : .landscapeLeft }}
override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
get { return (vertical) ? .portrait : .landscapeLeft }}
}
對不同的方向使用不同的UINavigationController
。 是的,推一個新UINavigationController
之前頂上UINavigationController
將主要是模式,但過渡看起來不錯。
為了方便起見,請使用用戶定義的運行時屬性來控制LandscapeNavigationController
的方向。
添加一個pop方法來處理now模式UIViewController
上的Back按鈕。
@IBAction func doBack(_ sender: UIBarButtonItem) {
if let navigationController = navigationController {
navigationController.dismiss(animated: true, completion: {
})
}
}
注意視圖C上的頂部和底部標簽是如何正確布局的。
►在GitHub上找到此解決方案以及有關Swift Recipes的其他詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.