iOS开发 之 iOS13新特性 以及 iOS13适配

iOS13正式版推送时间为2019年9月19日(北京时间2019年9月20日),与此同时发售iPhone 11,那我们就来说说iOS13的一些新特性吧

一、暗黑模式(官方叫做:深色模式)

iOS13最大的改变就是加入了暗黑模式(Dark Mode),苹果要求开发者跟进暗黑模式的开发!2020年苹果可能要求开发者必须是配Dark Mode否则不予上架(可能、可能、可能)

对比了解一下暗黑模式:

Dark Mode.png

Dark Mode适配.png
暗黑模式 Dark Mode 适配(没有适配暗黑模式之前,先禁用,Info.plist文件中UIUserInterfaceStyle设置为light)
1.UIColor
UIColor在iOS13系统上拥有了动态属性,iOS13之前UIColor只能表示一种颜色,iOS13以后能够表示两种模式下的不同颜色(例如:普通模式Light-白底黑字,暗黑模式Dark-黑底白字)
iOS13系统提供了一些动态颜色,也可以自定义动态颜色,下面我们一起看看使用事例,图片为效果图:

a.系统提供的动态颜色UIColor
[self.view setBackgroundColor:[UIColor systemBackgroundColor]]; // 13系统颜色方法,还有更多
[self.titleLabel setTextColor:[UIColor labelColor]]; // 13系统颜色方法
[self.detailLabel setTextColor:[UIColor placeholderTextColor]]; // 13系统颜色方法

b.自定义动态颜色UIColor
+ (UIColor *)colorWithDynamicProvider:(UIColor * (^)(UITraitCollection *))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
- (UIColor *)initWithDynamicProvider:(UIColor * (^)(UITraitCollection *))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
备注:这两个发发要求传入一个block进去,当系统切换LightMode和DarkMode时会触发此回调,并且这个Block会返回一个UITraitCollection类,我们需要使用其属性userInterfaceStyle来判断是LightMode还是DarkMode
UIColor *dyColor = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull trainCollection) {
        if ([trainCollection userInterfaceStyle] == UIUserInterfaceStyleLight) {
            return [UIColor redColor];
        }
        else {
            return [UIColor greenColor];
        }
    }];
 [self.bgView setBackgroundColor:dyColor];

c.iOS13中的CGColor
依然只能表示单一的颜色,但可以利用下面这个方法来判断的:
获取当前模式(Light or Dark):UITraitCollection.currentTraitCollection.userInterfaceStyle
还有就是对于CALayer等对象如何适配暗黑模式呢?
方法一:resolvedColor
通过当前traitCollection得到对应UIColor(比如控制器重写坚挺暗黑模式改变方法),然后将UIColor转换为CGColor
- (UIColor *)resolvedColorWithTraitCollection:(UITraitCollection *)traitCollection;
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    UIColor *dyColor = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull trainCollection) {
        if ([trainCollection userInterfaceStyle] == UIUserInterfaceStyleLight) {
            return [UIColor redColor];
        }
        else {
            return [UIColor greenColor];
        }
    }];
    UIColor *resolvedColor = [dyColor resolvedColorWithTraitCollection:previousTraitCollection];
    layer.backgroundColor = resolvedColor.CGColor;
}
方法二:performAsCurrent
使用当前trainCollection调用这个方法- (void)performAsCurrentTraitCollection:(void (^)(void))actions;
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    UIColor *dyColor = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull trainCollection) {
        if ([trainCollection userInterfaceStyle] == UIUserInterfaceStyleLight) {
            return [UIColor redColor];
        }
        else {
            return [UIColor greenColor];
        }
    }];
    [self.traitCollection performAsCurrentTraitCollection:^{
        layer.backgroundColor = dyColor.CGColor;
    }];
}
方法三:最简单的方法
直接设置为一个动态UIColor的CGColor即可
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    UIColor *dyColor = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull trainCollection) {
        if ([trainCollection userInterfaceStyle] == UIUserInterfaceStyleLight) {
            return [UIColor redColor];
        }
        else {
            return [UIColor greenColor];
        }
    }];
        layer.backgroundColor = dyColor.CGColor;
}
注意:设置layer颜色都是在traitCollectionDidChange中,意味着如果没有发生模式切换,layer将会没有颜色,需要设置一个基本颜色

d.控制器监听暗黑模式:(有时需求会用到,所以在ViewController中重写下面的方法就好了)
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection; // 注意:参数为变化前的traitCollection
- (BOOL)hasDifferentColorAppearanceComparedToTraitCollection:(UITraitCollection *)traitCollection; // 判断两个UITraitCollection对象是否不同
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    // trait发生了改变
    if ([self.traitCollection hasDifferentColorAppearanceComparedToTraitCollection:previousTraitCollection]) {
    // 执行操作
    }
}

e.模式切换时打印log
很方便的一种设置方式,操作步骤:
Xcode菜单栏-Product-Scheme-Edit Scheme - Run - Arguments Passed On Launch - 添加命令-UITraitCollectionChangeLoggingEnabled YES
![模式切换时打印log.png](https://upload-images.jianshu.io/upload_images/9062174-a492101c22f6409b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

f.强行设置APP模式
控制器页面直接设置 设置为Dark Mode即可,在View或者ViewController中可以设置,需要注意的是,当我们强行设置之后,这个ViewController下的View都是设置的模式,由这个控制器模态推出的控制器依然跟随系统模式,如果想一键设置APP下所有的ViewController都是Dark Mode,直接window执行overrideUserInterfaceStyle,window.rootViewController强行设置Dark Mode后模态推出的控制器依然跟随系统模式
[self setOverrideUserInterfaceStyle:UIUserInterfaceStyleDark]; 

g.NSAttributedString暗黑模式优化
NSDictionary *dic = @{NSFontAttributeName:[UIFont systemFontOfSize:16],NSForegroundColorAttributeName:[UIColor labelColor]};
NSAttributedString *str = [[NSAttributedString alloc] initWithString:@"富文本文案" attributes:dic];// 添加一个NSForegroundColorAttributeName属性

2.图片-暗黑模式(在iOS13暗黑模式下自由切换图片)
开发时需要放入两套2x3x图了---Any Apperarance、Dark Apperarance
详细步骤:a.打开Assets.xcassets
        b.新建一个Image Set
        c.打开右侧工具栏,点击最后一栏,找到Appearances,选择Any,Dark
        d.将两种模式下的图片拖放进去就可以了

以上就是颜色和图片的Dark Mode适配
效果图1.png

二、Status Bar状态栏更新

1.iOS13对Status Bar API做了修改
之前有两种状态(UIStatusBarStyleDefault文字黑色、UIStatusBarStyleLightContent文字白色)
iOS13以后有三种状态(多出来的一种状态:UIStatusBarStyleDefault自动选择黑色或者白色)

三、UIActivityIndicatorView加载视图

1.iOS13对UIActivityIndicatorView样式做了修改
之前有三种样式:UIActivityIndicatorViewStyleGray灰色、UIActivityIndicatorViewStyleWhite白色、UIActivityIndicatorViewStyleWhiteLarge白色大型
iOS13废弃了以上三种样式(用UIActivityIndicatorViewStyleLarge大型、UIActivityIndicatorViewStyleMedium中型替代),通过Color属性设置其颜色

五、其他

1.iOS将通过LaunchScreen来取代设置启动图
2.iOS MPMoviePlayerController将不能使用
3.控制器的ModalPresentationStyle默认值变了,变为UIModalPresentationFullScreen,解决方案就是self.modalPresentationStyle = UIModalPresentationOverFullScreen
4.iOS13禁止使用valueForKey,setVaule:ForKey的方式获取和设置私有属性,会引起Crash,解决方法就是使用其他方法替换
5.TabBar上设置的红点会偏移到左上方,遍历UITabBarButton的subViews发现只有在TabBar选中状态下才能取到UITabBarSwappableImageView,解决方法:在选中状态下对tabbar 设置    [tabBar layoutIfNeeded];
6.UISearchController上的SearchBar显示异常,高度变为只有1px。解决方法:解决办法是使用KVO监听frame值变化后设置去应该显示的高度。

参考文章:
iOS13 新特性简介
iOS13 暗黑模式(Dark Mode)适配之OC版
整理总结iOS 13适配遇到的问题

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352

推荐阅读更多精彩内容