簡體   English   中英

基於視圖大小的自適應UIPresentationController

[英]Adaptive UIPresentationController Based on View Size

我正在轉向基於UIPresentationController的視圖控制器演示文稿,但與API有些混淆。

我有一個自定義側邊欄樣式視圖控制器演示文稿(類似於LookInside WWDC 2014演示代碼)。

此類集群( UIPresentationControllerUIViewControllerTransitioningDelegateUIViewControllerAnimatedTransitioning )在常規大小類視圖中將視圖控制器作為側邊欄從屏幕邊緣呈現,並在緊湊大小類視圖上呈現與全屏相同的視圖控制器。

在可調整大小的iPad目標上進行測試顯示正確的行為:我將水平尺寸類設置為“緊湊”,我的視圖控制器從側邊欄切換到全屏。

但是,我想要更多粒度。 當設備處於橫向時,我想在iPhone 6和6+上使用側邊欄式視圖控制器演示,並且縱向使用所有iPhone的全屏風格演示。

所以在我的方法中

- (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator

我實現了一些邏輯來檢測側邊欄是否會占用太多屏幕,假設我使用以下條件:

//If my sidebar is going to occupy more than half the new width of the view...
if( self.sidebarTransitionController.width > size.width / 2.0 )
{
    //Override the presentation controller's trait collection with Compact horizontal size class
    sidebarPresentationController.overrideTraitCollection = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact];
}
else
{
    //Otherwise override the trait collection with Regular
    sidebarPresentationController.overrideTraitCollection = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular];

}

但這沒有任何作用。 UIPresentationController.overrideTraitCollection的文檔說明:

使用此屬性指定要應用於呈現和呈現視圖控制器的任何特征。 您指定的特征會覆蓋當前對視圖控制器有效的任何現有特征。 此屬性的默認值為nil。

為此屬性指定新值會導致表示控制器轉換到新的特征集,這可能會導致顯示給所顯示的界面的動畫。

將新值分配給演示控制器不會導致我呈現的界面以任何方式更改。 (即使在從UIViewControllerTransitioningDelegate對象中創建UIPresentationController時分配了overrideTraitCollection 。)

我錯過了什么? 是否可以在更細粒度的級別上使用UIPresentationController執行自適應演示?

是否可以在更細粒度的級別上使用UIPresentationController執行自適應演示?

不容易。

我建議其中一個選項:

  1. 放棄控制並接受UIKit有限的適應性:您可以更改為全屏演示或為特定特征集合呈現不同的視圖控制器。 使用此功能可以更快地發布您的應用。

  2. 使用演示文稿但對UIKit起作用。 一種方法是覆蓋viewWillTransitionToSize:withTransitionCoordinator:並解除然后重新呈現所呈現的視圖控制器,進行所需的任何更改,例如提供不同的演示樣式或演示控制器。 這可以在不花費太多時間的情況下給出好的結果。

  3. 使用視圖控制器包含。 這是您在堅持使用UIKit最佳實踐時可以達到的最低級別。 您的主視圖控制器成為容器視圖控制器的子項,而不是呈現您要求容器顯示其他視圖控制器。 如果應用程序應該是自定義和精致的,那么請使用此功能,您可以花時間將其做得恰到好處。

使用:

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller
                                                               traitCollection:(UITraitCollection *)traitCollection NS_AVAILABLE_IOS(8_3);

即使大小等級沒有改變,它也會被調用旋轉,所以這是一個習慣性/定向特定適應性的好地方。 請記住,iPhone 6可以在放大模式下運行。

我遇到了同樣的問題。 可以從大小類中解釋設備方向,雖然不是完全明確的,但以下方法適用於我的目的。

iOS 9編程:深入研究視圖,視圖控制器和框架 ,這本書充滿了如下重要細節:

horizontalSizeClassverticalSizeClass

UIUserInterfaceSizeClass值, .Regular.Compact 這些被稱為大小類 大小類組合具有以下含義:

垂直和水平尺寸類都是.Regular :我們在iPad上運行

垂直大小類是.Regular ,但水平大小類是.Compact :我們在iPhone上運行,應用程序是縱向的。 (或者,我們可能會在分離式iPad多任務配置的iPad上運行;請參閱第9章)。

垂直和水平尺寸類都是.Compact :我們在iPhone(iPhone 6 plus除外)上運行,橫向應用程序。

垂直大小類是.Compact ,水平大小類是.Regular :我們在橫向上運行在iPhone 6 plus上。

例如在View Controller中:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "ShowComposeView" {
        segue.destinationViewController.presentationController!.delegate = self
        segue.destinationViewController.modalPresentationStyle = .PageSheet
    }
}

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
    // If we do an adaptive presentation, and adapt from Page Sheet to Form Sheet,
    // then on iPhone 6 we will get the nice rounded corners of the nav bar 
    // in both portrait and landscape. (From pg. 298 of Programming iOS 9)

    // We want this behaviour on iPhone in Portrait orientation only.
    if traitCollection.horizontalSizeClass == .Compact && traitCollection.verticalSizeClass == .Regular {
        return .FormSheet
    }
    else {
        return .PageSheet
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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