基于视图大小的自适应UIPresentationController

sim*_*eon 16 iphone ios8 adaptive-ui uipresentationcontroller uitraitcollection

我正在转向UIPresentationController我的视图控制器的基础演示,但是与API有些混淆.

我有一个自定义侧边栏样式视图控制器演示文稿(类似于LookInsideWWDC 2014演示代码).

此类集群(UIPresentationController,UIViewControllerTransitioningDelegateUIViewControllerAnimatedTransitioning)在常规大小类视图中将视图控制器显示为屏幕边缘的侧边栏,并在紧凑大小的类视图上呈现与全屏相同的视图控制器.

在可调整大小的iPad目标上进行测试显示正确的行为:我将水平尺寸类设置为"紧凑",我的视图控制器从侧边栏切换到全屏.

但是,我想要更多粒度.当设备处于横向时,我想在iPhone 6和6+上使用侧边栏式视图控制器演示,并且纵向使用所有iPhone的全屏风格演示.

所以在我的方法中

- (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
Run Code Online (Sandbox Code Playgroud)

我实现了一些逻辑来检测侧边栏是否会占用太多屏幕,假设我使用以下条件:

//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];

}
Run Code Online (Sandbox Code Playgroud)

但这没有任何作用.UIPresentationController.overrideTraitCollection各州的文件:

使用此属性指定要应用于呈现和呈现视图控制器的任何特征.您指定的特征会覆盖当前对视图控制器有效的任何现有特征.此属性的默认值为nil.

为此属性指定新值会导致表示控制器转换到新的特征集,这可能会导致显示给所显示的界面的动画.

将新值分配给演示控制器不会导致我呈现的界面以任何方式更改.(即使我分配overrideTraitCollection的当UIPresentationController从内创建UIViewControllerTransitioningDelegate对象).

我错过了什么?是否有可能UIPresentationController在更细粒度的级别上执行自适应演示?

Dou*_*ill 2

\n

是否可以UIPresentationController在更细粒度的级别上执行自适应演示?

\n
\n\n

不容易。

\n\n

我建议使用以下选项之一:

\n\n
    \n
  1. 放弃控制并接受 UIKit\xe2\x80\x99s 有限的适应性:您可以更改为全屏演示或为特定特征集合呈现不同的视图控制器。使用它可以更快地发布您的应用程序。

  2. \n
  3. 使用演示文稿,但与 UIKit 配合使用。一种方法是覆盖viewWillTransitionToSize:withTransitionCoordinator:并关闭,然后重新呈现所呈现的视图控制器,进行所需的任何更改,例如提供不同的呈现样式或呈现控制器。这可以在不花费太多时间的情况下给出不错的结果。

  4. \n
  5. 使用视图控制器包含。这大约是您在坚持 UIKit 最佳实践的同时可以达到的最低级别。您的主视图控制器成为容器视图控制器的子级,而不是显示您要求容器显示其他视图控制器。如果应用程序应该是定制且精致的,那么请选择此选项,并且您可以花时间使其恰到好处。

  6. \n
\n