UITraitCollection详解

收录:原文地址

先说问题

最近在适配iOS13 有个Dark Mode的暗黑模式, 为了适配这个模式不得不在UIView和UIViewController以及UIWindow中复写如下方法

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
}

这里有个UITraitCollection的类以前从来没有仔细研究,今天详细研究一下.

Trait 特性 特点

显然 这个类是一个UIKit中用于处理苹果手机的一些特性的储存与UI相关的配置, 大家有没有想过如果你在iOS修改通用中的某些系统设置,比如(下图) 对比度、全局字体大小,这个我们开发人员怎么处理.

[站外图片上传中...(image-f50eec-1568792236158)]

这些系统的特性修改就放到这个UITraitCollection中,这个类也就是我们经常在VC和View中经常用到而大家往往容易忽略的,下面简单记录一下这些特性都有哪些

UITraitCollection API介绍

判断当前设备时 iPhone/iPad/tv/carPlay 的配置

+ (UITraitCollection *)traitCollectionWithUserInterfaceIdiom:(UIUserInterfaceIdiom)idiom;
@property (nonatomic, readonly) UIUserInterfaceIdiom userInterfaceIdiom; // unspecified: UIUserInterfaceIdiomUnspecified

关于布局方向的配置

+ (UITraitCollection *)traitCollectionWithLayoutDirection:(UITraitEnvironmentLayoutDirection)layoutDirection API_AVAILABLE(ios(10.0));
@property (nonatomic, readonly) UITraitEnvironmentLayoutDirection layoutDirection API_AVAILABLE(ios(10.0)); // unspecified: UITraitEnvironmentLayoutDirectionUnspecified

图片 Scale 的配置

+ (UITraitCollection *)traitCollectionWithDisplayScale:(CGFloat)scale;
@property (nonatomic, readonly) CGFloat displayScale; // unspecified: 0.0

布局 Size Class 的配置

+ (UITraitCollection *)traitCollectionWithHorizontalSizeClass:(UIUserInterfaceSizeClass)horizontalSizeClass;
@property (nonatomic, readonly) UIUserInterfaceSizeClass horizontalSizeClass; // unspecified: UIUserInterfaceSizeClassUnspecified
+ (UITraitCollection *)traitCollectionWithVerticalSizeClass:(UIUserInterfaceSizeClass)verticalSizeClass;
@property (nonatomic, readonly) UIUserInterfaceSizeClass verticalSizeClass; // unspecified: UIUserInterfaceSizeClassUnspecified

Force Touch 是否可用的配置

+ (UITraitCollection *)traitCollectionWithForceTouchCapability:(UIForceTouchCapability)capability API_AVAILABLE(ios(9.0));
@property (nonatomic, readonly) UIForceTouchCapability forceTouchCapability API_AVAILABLE(ios(9.0)); // unspecified: UIForceTouchCapabilityUnknown

全局字体大小的配置

+ (UITraitCollection *)traitCollectionWithPreferredContentSizeCategory:(UIContentSizeCategory)preferredContentSizeCategory API_AVAILABLE(ios(10.0));
@property (nonatomic, copy, readonly) UIContentSizeCategory preferredContentSizeCategory API_AVAILABLE(ios(10.0)); // unspecified: UIContentSizeCategoryUnspecified

色域的配置

+ (UITraitCollection *)traitCollectionWithDisplayGamut:(UIDisplayGamut)displayGamut API_AVAILABLE(ios(10.0));
@property (nonatomic, readonly) UIDisplayGamut displayGamut API_AVAILABLE(ios(10.0)); // unspecified: UIDisplayGamutUnspecified

是否开启高对比度的配置

+ (UITraitCollection *)traitCollectionWithAccessibilityContrast:(UIAccessibilityContrast)accessibilityContrast API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
@property (nonatomic, readonly) UIAccessibilityContrast accessibilityContrast API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos); // unspecified: UIAccessibilityContrastUnspecified

全局字重的配置

+ (UITraitCollection *)traitCollectionWithLegibilityWeight:(UILegibilityWeight)legibilityWeight API_AVAILABLE(ios(13.0), tvos(13.0), watchos(6.0));
@property (nonatomic, readonly) UILegibilityWeight legibilityWeight API_AVAILABLE(ios(13.0), tvos(13.0), watchos(6.0)); // unspecified: UILegibilityWeightUnspecified

主题的配置

+ (UITraitCollection *)traitCollectionWithUserInterfaceStyle:(UIUserInterfaceStyle)userInterfaceStyle API_AVAILABLE(tvos(10.0)) API_AVAILABLE(ios(12.0)) API_UNAVAILABLE(watchos);
@property (nonatomic, readonly) UIUserInterfaceStyle userInterfaceStyle API_AVAILABLE(tvos(10.0)) API_AVAILABLE(ios(12.0)) API_UNAVAILABLE(watchos); // unspecified: UIUserInterfaceStyleUnspecified

如何获取 UITraitCollection

UITraitCollection本身是一个配置的集合,每个 UIView/UIViewController都有自己的 UITraitCollection对象,并将自己的UITraitCollection传递给子UIView/UIViewController作为默认值。

  • 可以通过 UIView/UIViewController的属性 traitCollection 获取到当前视图的 UITraitCollection 对象
- (void)viewDidLoad {
    [super viewDidLoad];
    self.traitCollection //拿到当前得
}
  • 可以通过子类重写如下方法的方式监控 traitCollection 属性的变化
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
}
  • 获取全局的UITraitCollection
[UITraitCollection currentTraitCollection];

技巧

如果要在UIViewController中更新状态栏 当设置完style的时候可以调用

[self setNeedsStatusBarAppearanceUpdate];

总结

通过简单的学习UITraitCollection又深刻学习了一下这个类

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,912评论 1 32
  • 今天在文案班轮值,讲完课很开心……感觉行走的毒鸡汤已经控制不了洪荒之力自然散发…… 原来小伙伴们的响应也是可以刺激...
    夜的第七璋阅读 3,280评论 5 3
  • 我非常感恩您彩云,姐,也太想您,明年开年会,一定去,我会热烈地拥抱您!三辈子的恩人,何尝不时刻惦记,您一定保重身体...
    ffff2f1ee556阅读 1,067评论 0 0
  • 她是我人生的指路人;她是我在黑暗中的那道光;她就是我的老师,块告诉了我的人生,它让我懂得了许许多多...
    张九紫阅读 1,477评论 0 0
  • 把控制圈的事情做到极致,影响圈自然变大。很喜欢这句话。区分自己的控制圈和影响圈,这是一前提。避免错觉把影响圈一些事...
    子悦andjess阅读 5,227评论 3 9

友情链接更多精彩内容