美文网首页iOS开发小Tips
Xcode 13 Vary For Traits

Xcode 13 Vary For Traits

作者: 冷武橘 | 来源:发表于2022-06-20 17:39 被阅读0次

    一、Size class

    什么是Size Classes?

    size classes也是出现在iOS8的功能,.xib文件也是可以使用的,但大部分情况还是基于SB来使用,从xcode6开始我们新建的xib或SB文件中对应的View下方显示wAny hAny,点击后发现是可以选择的,选择不同的情况,View又变成了不同的形状,这就是size classes。

    也可以这么理解,size classes就是对设备的屏幕尺寸进行了抽象,宽高都分别用Regular、Compact来表示,我们其实不用太在意名称,只知道,以后不同的设备或者不同的状态(横竖屏)可以由这种描述来表示即可。
    更多参考。:https://www.jianshu.com/p/576f9971e2cc

    Device size classes

    截屏2022-06-20 17.23.06.png

    更多详细参考官方文档

    二、 Vary Constraints In Xcode 13

    Xcode的文档好像还没有跟上,但答案似乎是回到创建约束的Installed属性的变化。你会在尺寸检查器中发现:


    image.png

    实际的例子

    如果我们需要将一个蓝色的View,在横竖屏情况下有不同的布局显示。如下图所示:一个在竖屏情况下居中显示,一个在横屏情况下左上角显示。

    WechatIMG168.jpeg

    分析一下: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设置好约束。

    截屏2022-06-21 09.41.44.png
    2、勾掉右边的install
    展开左侧栏的约束,分别选中对应约束,勾选掉installed
    截屏2022-06-21 10.03.01.png
    默认的installed被勾选,意思就是约束对所有的size classes约束都生效,所以为了实现最初的需求,我们首先把View.centerX=centerX,View.centY=centerY的installed,因为我们的需求并不区分大小,所以height=200,width=200的installed就不需要勾选
    3、添加你需要的installed
    选中相应的约束,点击右侧的+号
    截屏2022-06-21 10.11.33.png
    选择Width-Compact,Height-Regular之后,Add Variation。并勾选wC hR installed。
    [图片上传中...(截屏2022-06-21 10.17.11.png-96d92e-1655777836782-0)] 截屏2022-06-21 10.17.45.png

    做完以上的设置,我们已经完成了对竖屏下的布局约束,接下来继续对横屏下的布局约束进行设置
    4、设置横屏
    旋转之xib面板为横屏,然后按照重复之前的操作,添加Width-Any,Height-Compact installed


    截屏2022-06-21 10.23.59.png 截屏2022-06-21 10.25.29.png

    三、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 {
    
        }
    }
    

    相关文章

      网友评论

        本文标题:Xcode 13 Vary For Traits

        本文链接:https://www.haomeiwen.com/subject/dzyjvrtx.html