首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于视图大小的自适应UIPresentationController

基于视图大小的自适应UIPresentationController
EN

Stack Overflow用户
提问于 2015-04-09 13:28:30
回答 3查看 2.1K关注 0票数 15

我将转到基于UIPresentationController的视图控制器演示文稿,但是遇到了一些与API混淆的地方。

我有一个自定义的侧边栏式视图控制器演示(类似于LookInside 2014年演示代码)。

这个类集群(UIPresentationControllerUIViewControllerTransitioningDelegateUIViewControllerAnimatedTransitioning)在常规大小类视图上从屏幕边缘显示一个视图控制器作为侧边栏,并在紧凑大小类视图上显示与全屏相同的视图控制器。

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

但是,我想要更多的粒度。当设备处于横向方向时,我想在iPhone 6和6+上使用侧边栏样式的视图控制器表示,并在纵向方向上对所有iPhones使用全屏样式表示。

所以用我的方法

代码语言:javascript
复制
- (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator

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

代码语言:javascript
复制
//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的文档声明:

使用此属性可指定要应用于呈现视图控制器和表示视图控制器的任何特征。您指定的特征覆盖当前对视图控制器有效的所有现有特征。此属性的默认值为零。 为该属性分配一个新值将导致表示控制器转换到新的一组特征,这可能会导致对所示接口的动画。

将新值分配给表示控制器并不会导致呈现的接口发生任何改变。(即使我在从overrideTraitCollection对象中创建UIPresentationController时指定了UIViewControllerTransitioningDelegate。)

我遗漏了什么?是否有可能在更细粒度的级别上使用UIPresentationController执行自适应表示?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-18 15:13:09

是否有可能在更细粒度的级别上使用UIPresentationController执行自适应表示?

不容易。

我建议以下其中一种选择:

  1. 放弃控制,接受UIKit有限的适应性:您可以更改为全屏演示文稿,或者为特定的特性集合提供不同的视图控制器。用这个更快地发布你的应用程序。
  2. 使用演示文稿,但与UIKit相反。一种方法是重写viewWillTransitionToSize:withTransitionCoordinator:并解散,然后重新呈现呈现的视图控制器,进行任何您想要的更改,例如提供不同的表示样式或表示控制器。这可以在不花费太多时间的情况下给出好的结果。
  3. 使用视图控制器遏制。这是您在坚持使用UIKit最佳实践时所能达到的最低级别。主视图控制器变成容器视图控制器的子视图,而不是让容器显示另一个视图控制器。如果这个应用应该是定制的和精致的,你可以花时间让它变得恰到好处。
票数 2
EN

Stack Overflow用户

发布于 2016-03-05 03:18:23

使用:

代码语言:javascript
复制
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller
                                                               traitCollection:(UITraitCollection *)traitCollection NS_AVAILABLE_IOS(8_3);

它被称为旋转,即使大小类没有改变,所以是一个很好的地方来做你的成语/定向特定的适应。请记住,iPhone 6可以在放大模式下运行。

票数 1
EN

Stack Overflow用户

发布于 2016-04-08 04:12:52

我也遇到了同样的问题。从size类解释设备方向是可能的,虽然不是完全明确,但下面的解释对我来说是可行的。

来自编程iOS 9:深入研究视图、视图控制器和框架的一本很棒的书,里面有很多重要的细节,比如:

horizontalSizeClassverticalSizeClass 一个UIUserInterfaceSizeClass值,.Regular.Compact。这些被称为大小类。 size类组合在一起具有以下含义: 垂直和水平大小类都是.Regular:我们运行在iPad上 垂直大小类是.Regular,但是水平大小类是.Compact:我们在一个iPhone上运行,该应用程序具有纵向方向。(或者,我们可能在一个iPad上运行一个分屏iPad多任务配置;参见第9章)。 垂直和水平大小类都是.Compact:我们在一个iPhone上运行( iPhone 6+除外),该应用程序是面向景观的。 垂直尺寸类是.Compact,水平大小类是.Regular:我们运行在iPhone 6+的横向方向上。

例如,在视图主计长中:

代码语言:javascript
复制
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
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29539877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档