强制视图上的特定大小类

时间:2015-02-23 14:28:59

标签: ios objective-c autolayout nslayoutconstraint size-classes

我认为iPad和iPad之间需要不同的约束。 iPhone版。

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

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

2 个答案:

答案 0 :(得分:7)

通过调用-setOverrideTraitCollection:forChildViewController:,可以轻松实现UIViewController上的特征收集。

但是,正如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建议表明只需要提供被覆盖的特征,这是有道理的,因为在旧的+新合并集合的原始答案中,它不清楚它是如何知道使用哪个。

答案 1 :(得分:0)

通过调用-setOverrideTraitCollection:forChildViewController:,可以轻松实现UIViewController上的特征收集。

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

您还需要确保正确创建特征集合,这在UITraitCollection Class Reference

的简介中有所描述。 编辑:This answer by Nick Lockwood,编写了核心动画高级技术,他说"那不是它应该如何使用"但答案来自2012 / iOS 5,从那时起,View Controller演示文稿已经过简化,并且引入了大小类(以及专门用于覆盖它们的方法)。

我认为您可以在视图控制器出现之前或之前将视图控制器设置为子视图并-setOverrideTraitCollection:forChildViewController:。在最糟糕的情况下,您可以创建一个通用的UIViewController,将其作为一个孩子嵌入其中并呈现它。如果这些技术中的任何一种适合您,请告诉我们。