强制视图上的特定大小类

Posted

技术标签:

【中文标题】强制视图上的特定大小类【英文标题】:Force a specific Size Class on a view 【发布时间】:2015-02-23 14:28:59 【问题描述】:

我的视图需要 iPad 和 iPhone 版本之间的不同约束。

登录屏幕在 iPhone 上显示为全屏,在 iPad 上显示为页面表。由于尺寸的原因,UITextFields 在 iPhone 上距左右两侧 40 像素,但我希望它们在 iPad 上为 80 像素。我将此设置为最终值大小类(w 常规,h 常规)的特定约束。

但是,由于此视图显示在页面上,它不使用最终值大小类。理想情况下,我想“强制”视图使用大小类,而不是拥有一系列 iPhone/iPad 约束和大量约束 Outlets。

【问题讨论】:

你为什么不为你的约束创建一个辅助函数呢?然后,您要做的就是检测它是什么设备并将您想要的正确大小传递给此函数..? 【参考方案1】:

实现这一点的方法是使用UIViewController 上的特征集合,只需调用-setOverrideTraitCollection:forChildViewController: 即可。

然而,正如 API 标题所示,UIViewController 只能让其 traitCollection 被其父级覆盖。呈现的视图控制器不是其父级的子级(头文件特别指出呈现的视图控制器不包含在子视图控制器中),因此您必须添加“ToPresentViewController”。

在这个例子中,在 IB 中有一个 ToPresentViewController 场景,它只是一个容器 ViewController 附加到它的两侧,约束为 0,并且将呈现嵌入的视图控制器。

@implementation ToPresentViewController


-(void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection 
    [super traitCollectionDidChange:previousTraitCollection];

    if(thisDevice.userInterfaceIdiom != UIUserInterfaceIdiomPad)
    
        return;
    

    for (UIViewController *controller in self.childViewControllers)  //Should be only one
        UITraitCollection *regularWidthTraits = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular];
        [self setOverrideTraitCollection:regularWidthTraits forChildViewController:controller];
    


这将在 iPad 上将尺寸等级锁定为常规。

编辑:WWDC sample code here 建议只需要提供被覆盖的特征,这是有道理的,因为在旧+新合并集合的原始答案中,不清楚它是如何知道使用哪个的。

【讨论】:

我遇到了一个问题,我的 VC 中没有安装 trait-collection 特定的约束。原来这是由覆盖整个特征集合的代码引起的,而不仅仅是我们想要修改的特征。由于您在编辑中指出 WWDC 示例代码建议只需要提供被覆盖的特征,我才知道这一点。谢谢你。据我所知,这在任何地方都没有记录。当你想覆盖一个特征集合中的特征时,只覆盖那些特征,而不是整个集合!【参考方案2】:

实现这一点的方法是使用UIViewController 上的特征集合,很容易调用-setOverrideTraitCollection:forChildViewController:

这意味着你需要让你的视图实际上是一个显式的子视图控制器,这一直是推荐的做法(实际上在其他方面可能是有益的),我认为它可能是自动的,但是如果没有,父/子关系有办法与呈现/呈现的视图控制器关系很好地融合。

您还需要确保正确创建特征集合,这在UITraitCollection Class Reference 的介绍中有所描述

编辑:This answer by Nick Lockwood,Core Animation Advanced Techniques 的作者,他说“这不是它应该使用的方式”,但答案来自 2012/ios 5,从那时起 View Controller 演示文稿已被简化并引入了大小类(以及专门覆盖它们的方法)。

我认为您可以将视图控制器设置为子视图,并在演示之前或之前将其设置为 -setOverrideTraitCollection:forChildViewController:。在最坏的情况下,您可以创建一个通用的 UIViewController,将您的作为孩子嵌入其中并呈现出来。让我们知道这些技术是否适合您。

【讨论】:

以上是关于强制视图上的特定大小类的主要内容,如果未能解决你的问题,请参考以下文章

强制 UITabBarItem 图像为特定大小

如何调整 UIView 的大小并强制其子视图调整大小

我可以直接从具有特定大小类或特征集合的 xib 加载 UITableViewCell 吗?

iOS 9 上的 UICollectionViewCell 中的大小类错误

如何强制视图呈现自己?

Android列表视图将内容包装到基于页脚大小的特定大小