Wil*_*son 3 objective-c ios autolayout nslayoutconstraint size-classes
我有一个视图,需要iPad和iPhone版本之间的不同约束.
登录屏幕在iPhone上以及在iPad上的页面表中以全屏显示.由于尺寸的原因,UITextFields距离iPhone的右侧和左侧40像素,但我希望它们在iPad上为80像素.我将其设置为最终值大小类(w Regular,h Regular)的特定约束.
但是,因为此视图显示在页面表上,所以它不使用最终值大小类.理想情况下,我想"强制"视图使用大小类,而不是拥有一组iPhone/iPad约束和许多约束Outlets.
这意味着要实现的方法是使用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];
}
}
Run Code Online (Sandbox Code Playgroud)
这将在iPad上将大小类锁定为常规.
编辑:这里建议的WWDC示例代码表明只需要提供被覆盖的特征,这是有道理的,因为在旧的+新合并集合的原始答案中,不清楚它是如何知道使用的.