iOS13适配的实现方法
1.私有kvc
[self setvalue:basetabbar forkey:@"tabbar"]; //正常 [_textfield setvalue:[uicolor redcolor] forkeypath:@"_placeholderlabel.textcolor"];///崩溃 [_textfield setvalue:[uifont systemfontofsize:14] forkeypath:@"_placeholderlabel.font"];///崩溃 _textfield.attributedplaceholder = [[nsattributedstring alloc] initwithstring:@"姓名" attributes:@{nsfontattributename:[uifont systemfontofsize:14],nsforegroundcolorattributename:[uicolor redcolor]}]; ///新的实现
在xcode10上编译不会有问题,但是在xcode11上编译的会崩溃。并且- (void)setvalue:(nullable id)value forkey:(nsstring *)key方法没问题,- (void)setvalue:(nullable id)value forkeypath:(nsstring *)keypath会崩溃
2.presentviewcontroller的问题
会出现这种情况是主要是因为我们之前对uiviewcontroller里面的一个属性,即modalpresentationstyle(该属性是控制器在模态视图时将要使用的样式)没有设置需要的类型。在ios13中modalpresentationstyle的默认改为uimodalpresentationautomatic,而在之前默认是uimodalpresentationfullscreen。
这个不受xcode版本的影响,只要是ios13的系统,没有显式设置modalpresentationstyle,就会有这个问题
3.即将废弃的 launchimage
从 ios 8 的时候,苹果就引入了 launchscreen,我们可以设置 launchscreen来作为启动页。当然,现在你还可以使用launchimage来设置启动图。不过使用launchimage的话,要求我们必须提供各种屏幕尺寸的启动图,来适配各种设备,随着苹果设备尺寸越来越多,这种方式显然不够 flexible。而使用 launchscreen的话,情况会变的很简单, launchscreen是支持autolayout+sizeclass的,所以适配各种屏幕都不在话下。 注意啦⚠️,从2020年4月开始,所有使⽤ ios13 sdk 的 app 将必须提供 launchscreen,launchimage即将退出历史舞台
4.暗黑模式
原理
1.将同一个资源,创建出两种模式的样式。系统根据当前选择的样式,自动获取该样式的资源
2.每次系统更新样式时,应用会调用当前所有存在的元素调用对应的一些重新方法,进行重绘视图,可以在对应的方法做相应的改动
资源文件适配
1.创建一个assets文件(或在现有的assets文件中)
2.新建一个图片资源文件(或者颜色资源文件、或者其他资源文件)
3.选中该资源文件, 打开 xcode ->view ->inspectors ->show attributes inspectors (或者option+command+4)视图,将apperances 选项 改为any,dark
4.执行完第三步,资源文件将会有多个容器框,分别为 any apperance 和 dark apperance. any apperance 应用于默认情况(unspecified)与高亮情况(light), dark apperance 应用于暗黑模式(dark)
5.代码默认执行时,就可以正常通过名字使用了,系统会根据当前模式自动获取对应的资源文件
注意
同一工程内多个assets文件在打包后,就会生成一个assets.car 文件,所以要保证assets内资源文件的名字不能相同
uiview
traitcollectiondidchange(_:) layoutsubviews() draw(_:) updateconstraints() tintcolordidchange()
uiviewcontroller
traitcollectiondidchange(_:) updateviewconstraints() viewwilllayoutsubviews() viewdidlayoutsubviews()
uipresentationcontroller
traitcollectiondidchange(_:) containerviewwilllayoutsubviews() containerviewdidlayoutsubviews()
全局关闭黑暗模式
方式一 配置plist文件: 在info.plist 文件中,添加uiuserinterfacestyle key 名字为 user interface style 值为string,将uiuserinterfacestyle key 的值设置为 light
在开发中,如果用的系统控件(如cell、tableview的背景色)未设置背景色(或者为透明),则进入暗黑模式后,控件背景色变为黑色。
可以每一个页面设置,当然也可以整体设置,
一般我们的app都是在一个window下的,那就整体设置app里的window
方式二 :代码关闭黑暗模式 强制关闭暗黑模式
#if defined(__iphone_13_0) && __iphone_os_version_max_allowed >= __iphone_13_0 if(@available(ios 13.0,*)){ self.window.overrideuserinterfacestyle = uiuserinterfacestylelight; } #endif
单个界面不遵循暗黑模式
- uiviewcontroller与uiview 都新增一个属性 overrideuserinterfacestyle
- 将 overrideuserinterfacestyle 设置为对应的模式,则强制限制该元素与其子元素以设置的模式进行展示,不跟随系统模式改变进行改变
- 设置 viewcontroller 的该属性, 将会影响视图控制器的视图和子视图控制器采用该样式
- 设置 view 的该属性, 将会影响视图及其所有子视图采用该样式
- 设置 window 的该属性, 将会影响窗口中的所有内容都采用样式,包括根视图控制器和在该窗口中显示内容的所有演示控制器(uipresentationcontroller)
ios适配暗黑模式:
5.增加一直使用蓝牙的权限申请
cbcentralmanager,ios13以前,使用蓝牙时可以直接用,不会出现权限提示,ios13后,再使用就会提示了。
在info.plist里增加
<key>nsbluetoothalwaysusagedescription</key> <string>我们要一直使用您的蓝牙,具体做什么别问我</string>`
6.使用mjextension 中处理nsnull的不同
这个直接会导致crash的在将服务端数据字典转换为模型时,如果遇到服务端给的数据为nsnull时,
mj_jsonobject,其中 class_copypropertylist方法得到的属性里,多了一种efsqlbinding类型的东西,而且属性数量也不准确,那就没办法了,我只能改写这个方法了,这个组件没有更新的情况下,写了一个方法swizzling掉把当遇到 nsnull时,直接转为nil了。
7. wkwebview 中测量页面内容高度的方式变更
ios 13以前
document.body.scrollheight
ios 13中
document.documentelement.scrollheight
两者相差55 应该是浏览器定义高度变了
8. 友盟消息推送,获取devicetoken适配
- (void)application:(uiapplication *)application didregisterforremotenotificationswithdevicetoken:(nsdata *)devicetoken { if (![devicetoken iskindofclass:[nsdata class]]) return; const unsigned *tokenbytes = (const unsigned *)[devicetoken bytes]; nsstring *hextoken = [nsstring stringwithformat:@"%08x%08x%08x%08x%08x%08x%08x%08x",ntohl(tokenbytes[0]), ntohl(tokenbytes[1]), ntohl(tokenbytes[2]),ntohl(tokenbytes[3]), ntohl(tokenbytes[4]), ntohl(tokenbytes[5]),ntohl(tokenbytes[6]),ntohl(tokenbytes[7])]; pushdevicetoken = hextoken; nslog(@"devicetoken:%@",hextoken); }
9. statusbar 与之前版本不同
目前状态栏也增加了一种模式,由之前的两种,变成了三种, 其中default由之前的黑色内容,变成了会根据系统模式,自动选择当前展示lightcontent还是darkcontent
10. fishhook 导致的crash ())
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: iOS13原生端适配攻略(推荐)
下一篇: c#中泛型