在视图上强制指定大小 Class
Force a specific Size Class on a view
我认为 iPad 和 iPhone 版本之间需要不同的约束。
登录屏幕在 iPhone 上显示为全屏,在 iPad 上显示为页面 sheet。由于大小的原因,UITextFields 在 iPhone 上与左右两侧相距 40 像素,但我希望它们在 iPad 上相距 80 像素。我将其设置为最终值大小的特定约束 Class (w Regular, h Regular).
但是,由于此视图显示在页面上 sheet,因此它不使用最终值大小 Class。理想情况下,我希望 "force" 视图使用大小 class,而不是具有 iPhone/iPad 约束数组和大量约束 Outlets。
实现此目的的方法是在 UIViewController 上使用特征集合,通过调用 -setOverrideTraitCollection:forChildViewController:
很容易。
这意味着你需要让你的视图实际上是一个显式的子视图控制器,这一直是推荐的做法(实际上在其他方面也有好处),我认为它可能是自动的,但如果没有,parent/child 关系可以与 presenting/presented 视图控制器关系很好地融合。
您还需要确保正确创建特征集合,这在 UITraitCollection Class Reference
的介绍中有描述
编辑:This answer by Nick Lockwood,谁写了 核心动画高级技术 ,说 "That's not how it's supposed to be used" 但答案来自 2012/iOS 5,从那时起,View Controller 的呈现得到了简化,并且引入了 size 类(以及专门用于覆盖它们的方法)。
我认为您可以使视图控制器成为子视图控制器,并在显示它之前或之前在其上 -setOverrideTraitCollection:forChildViewController:
。在最坏的情况下,您可以创建一个通用的 UIViewController,将您的 UIViewController 作为子项嵌入其中并呈现它。让我们知道这些技术是否适合您。
实现此目的的方法是在 UIViewController 上使用特征 collections,通过调用 -setOverrideTraitCollection:forChildViewController:
即可轻松实现。
然而,正如 API 标题所示,UIViewController 的 traitCollection 只能被其 parent 覆盖。 Presented View Controllers aren't children of their parent(header 文件特别指出 Child View Controllers 中不包含 presented View Controllers)所以你必须添加一个"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];
}
}
这会将尺寸 class 锁定为 iPad 的常规尺寸。
编辑:WWDC sample code here 建议只需要提供被覆盖的特征,这是有道理的,因为在原始答案中,旧+新合并 collection 不清楚它是如何知道使用哪个。
我认为 iPad 和 iPhone 版本之间需要不同的约束。
登录屏幕在 iPhone 上显示为全屏,在 iPad 上显示为页面 sheet。由于大小的原因,UITextFields 在 iPhone 上与左右两侧相距 40 像素,但我希望它们在 iPad 上相距 80 像素。我将其设置为最终值大小的特定约束 Class (w Regular, h Regular).
但是,由于此视图显示在页面上 sheet,因此它不使用最终值大小 Class。理想情况下,我希望 "force" 视图使用大小 class,而不是具有 iPhone/iPad 约束数组和大量约束 Outlets。
实现此目的的方法是在 UIViewController 上使用特征集合,通过调用 -setOverrideTraitCollection:forChildViewController:
很容易。
这意味着你需要让你的视图实际上是一个显式的子视图控制器,这一直是推荐的做法(实际上在其他方面也有好处),我认为它可能是自动的,但如果没有,parent/child 关系可以与 presenting/presented 视图控制器关系很好地融合。
您还需要确保正确创建特征集合,这在 UITraitCollection Class Reference
的介绍中有描述编辑:This answer by Nick Lockwood,谁写了 核心动画高级技术 ,说 "That's not how it's supposed to be used" 但答案来自 2012/iOS 5,从那时起,View Controller 的呈现得到了简化,并且引入了 size 类(以及专门用于覆盖它们的方法)。
我认为您可以使视图控制器成为子视图控制器,并在显示它之前或之前在其上 -setOverrideTraitCollection:forChildViewController:
。在最坏的情况下,您可以创建一个通用的 UIViewController,将您的 UIViewController 作为子项嵌入其中并呈现它。让我们知道这些技术是否适合您。
实现此目的的方法是在 UIViewController 上使用特征 collections,通过调用 -setOverrideTraitCollection:forChildViewController:
即可轻松实现。
然而,正如 API 标题所示,UIViewController 的 traitCollection 只能被其 parent 覆盖。 Presented View Controllers aren't children of their parent(header 文件特别指出 Child View Controllers 中不包含 presented View Controllers)所以你必须添加一个"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];
}
}
这会将尺寸 class 锁定为 iPad 的常规尺寸。
编辑:WWDC sample code here 建议只需要提供被覆盖的特征,这是有道理的,因为在原始答案中,旧+新合并 collection 不清楚它是如何知道使用哪个。