一、Size class
什么是Size Classes?
size classes也是出现在iOS8的功能,.xib文件也是可以使用的,但大部分情况还是基于SB来使用,从xcode6开始我们新建的xib或SB文件中对应的View下方显示wAny hAny,点击后发现是可以选择的,选择不同的情况,View又变成了不同的形状,这就是size classes。
也可以这么理解,size classes就是对设备的屏幕尺寸进行了抽象,宽高都分别用Regular、Compact来表示,我们其实不用太在意名称,只知道,以后不同的设备或者不同的状态(横竖屏)可以由这种描述来表示即可。
更多参考。://www.greatytc.com/p/576f9971e2cc
Device size classes
二、 Vary Constraints In Xcode 13
Xcode的文档好像还没有跟上,但答案似乎是回到创建约束的Installed属性的变化。你会在尺寸检查器中发现:
实际的例子
如果我们需要将一个蓝色的View,在横竖屏情况下有不同的布局显示。如下图所示:一个在竖屏情况下居中显示,一个在横屏情况下左上角显示。
分析一下:iphone竖屏情况下,所有的机型的size classes都是: width-Compact, height-Regular,所以我们只需要在width-Compact, height-Regular的条件下设置约束就好。而iPhone横屏情况下,一部分的机型是width-Compact, height-Compact,一部分机型是width-Regular, height-Compact,综合一下就是width-Any,height-Compact的条件下设置约束就可以。
接下来我们用xcode13来构建约束吧!
1、首先按常规的操作,用Xib设置好约束。
2、勾掉右边的install
展开左侧栏的约束,分别选中对应约束,勾选掉installed
默认的installed被勾选,意思就是约束对所有的size classes约束都生效,所以为了实现最初的需求,我们首先把View.centerX=centerX,View.centY=centerY的installed,因为我们的需求并不区分大小,所以height=200,width=200的installed就不需要勾选
3、添加你需要的installed
选中相应的约束,点击右侧的+号
选择Width-Compact,Height-Regular之后,Add Variation。并勾选wC hR installed。
做完以上的设置,我们已经完成了对竖屏下的布局约束,接下来继续对横屏下的布局约束进行设置
4、设置横屏
旋转之xib面板为横屏,然后按照重复之前的操作,添加Width-Any,Height-Compact installed
三、UITraitCollection
UITraitCollection为表征 size class 而生,用来区分设备。你可以在它身上获取到足以区分所有设备的特征。
@protocol UITraitEnvironment <NSObject>
@property (nonatomic, readonly) UITraitCollection *traitCollection
NSLog(@"%@",self.traitCollection);
控制台打印:
<UITraitCollection: 0x600002a27d40; UserInterfaceIdiom = Phone, DisplayScale = 2, DisplayGamut = P3, HorizontalSizeClass = Compact, VerticalSizeClass = Regular, UserInterfaceStyle = Light, UserInterfaceLayoutDirection = LTR, ForceTouchCapability = Unavailable, PreferredContentSizeCategory = L, AccessibilityContrast = Normal, UserInterfaceLevel = Base>
if (self.traitCollection.horizontalSizeClass==UIUserInterfaceSizeClassCompact&&self.traitCollection.verticalSizeClass==UIUserInterfaceSizeClassRegular&&self.traitCollection.userInterfaceIdiom == UIUserInterfaceIdiomPhone) {
NSLog(@"竖屏");
}else{
NSLog(@"横屏");
}
可以通过子类重写如下方法的方式监控 traitCollection 属性的变化
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
[super traitCollectionDidChange:previousTraitCollection];
if (@available(iOS 12.0, *)) {
if(self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleLight){
NSLog(@"浅色模式");
}else if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark){
NSLog(@"深色模式");
}
} else {
}
}