![](/img/trans.png)
[英]Force UISplitViewController to always show master (only) in landscape (on iPhone 6 Plus)
[英]UISplitViewController - prevent splitting in landscape on iPhone 6 plus
我在我的應用程序中使用UISplitViewController。 這在iPad上可以很好地工作,其中主要和次要總是可見的,並且它在大多數iPhone上工作得很好,它像UINavigationController一樣工作。
在iPhone 6+和6S +上,分割視圖就像是縱向的iPhone,就像風景中的iPad一樣。 這種景觀分裂導致了我的問題,我想避免它。
有沒有辦法阻止UISplitViewController在iPhone 6+環境中顯示主控制器和輔助控制器? 我只想讓它顯示輔助控制器,就像它對其他iPhone一樣。
謝謝。
我能夠通過繼承UISplitViewController然后覆蓋特征集合來執行此操作,以在設備不是iPad時返回緊湊的水平尺寸類。 我知道這些天檢查界面習語是一種虛假的做法,但我不知道怎么做。
我只是將這個方法添加到我的UISplitViewController子類中:
-(UITraitCollection *)traitCollection {
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
return [super traitCollection];
} else {
return [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact];
}
}
任何有關更好的方法的建議當然是受歡迎的。
這是Swift中的相同答案,但也有一個修復,其中垂直大小類在手機橫向錯誤:
override var traitCollection: UITraitCollection {
if UI_USER_INTERFACE_IDIOM() == .pad {
return super.traitCollection
} else {
let horizontal = UITraitCollection(horizontalSizeClass: .compact)
let vertical = UITraitCollection(verticalSizeClass: super.traitCollection.verticalSizeClass)
return UITraitCollection.init(traitsFrom: [horizontal, vertical])
}
}
我有一些問題,UINavigationControllers無法正確顯示上面的代碼。 這是適合我的方法(Swift 5):
1)創建一個包含UIContainerView的UIViewController
2)將UISplitViewController嵌入該容器中
3)添加以下代碼:
class SplitViewContainerViewController: UIViewController {
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
if UI_USER_INTERFACE_IDIOM() != .pad {
performOverrideTraitCollection()
}
}
private func performOverrideTraitCollection() {
for childVC in self.children {
setOverrideTraitCollection(UITraitCollection(horizontalSizeClass: .compact), forChild: childVC)
}
}
}
4)將包含容器視圖的視圖控制器設置為SplitViewContainerViewController
適用於iOS 13的更新
上面的代碼不再適用於iOS 13.在SplitViewContainerViewController類中使用以下代碼:
override func overrideTraitCollection(forChild childViewController: UIViewController) -> UITraitCollection? {
if UIDevice.current.userInterfaceIdiom != .pad {
return UITraitCollection(horizontalSizeClass: .compact)
} else {
return super.traitCollection
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.