欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS13适配的实现方法

程序员文章站 2022-10-12 15:10:29
1.私有kvc [self setvalue:basetabbar forkey:@"tabbar"]; //正常 [_textfield setvalue:[ui...

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 ())

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇: 萌宝宝

下一篇: 医院招收实习生