簡體   English   中英

UISplitViewController - 防止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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM