当前位置: 移动技术网 > IT编程>移动开发>IOS > iOS13适配的实现方法

iOS13适配的实现方法

2020年03月09日  | 移动技术网IT编程  | 我要评论

品客网,食用菌网,国槐

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

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

  • ios uicollectionview实现横向滚动

    现在使用卡片效果的app很多,之前公司让实现一种卡片效果,就写了一篇关于实现卡片的文章。文章最后附有demo实现上我选择了使用uicollectionview ... [阅读全文]
  • iOS UICollectionView实现横向滑动

    本文实例为大家分享了ios uicollectionview实现横向滑动的具体代码,供大家参考,具体内容如下uicollectionview的横向滚动,目前我使... [阅读全文]
  • iOS13适配深色模式(Dark Mode)的实现

    iOS13适配深色模式(Dark Mode)的实现

    好像大概也许是一年前, mac os系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的终于, 随着iphone11等新手机的发售, ios 13系统... [阅读全文]
  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    xcode11新建项目工程,新增了scenedelegate这个类,转而将原appdelegate负责的对ui生命周期的处理担子接了过来。故此可以理解为:ios... [阅读全文]
  • iOS实现转盘效果

    本文实例为大家分享了ios实现转盘效果的具体代码,供大家参考,具体内容如下demo下载地址: ios转盘效果功能:实现了常用的ios转盘效果,轮盘抽奖效果的实现... [阅读全文]
  • iOS开发实现转盘功能

    本文实例为大家分享了ios实现转盘功能的具体代码,供大家参考,具体内容如下今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看viewcontroller#... [阅读全文]
  • iOS实现轮盘动态效果

    本文实例为大家分享了ios实现轮盘动态效果的具体代码,供大家参考,具体内容如下一个常用的绘图,主要用来打分之类的动画,效果如下。主要是ios的绘图和动画,本来想... [阅读全文]
  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手... [阅读全文]
  • iOS实现卡片堆叠效果

    本文实例为大家分享了ios实现卡片堆叠效果的具体代码,供大家参考,具体内容如下如图,这就是最终效果。去年安卓5.0发布的时候,当我看到安卓全新的material... [阅读全文]
  • iOS利用余弦函数实现卡片浏览工具

    iOS利用余弦函数实现卡片浏览工具

    本文实例为大家分享了ios利用余弦函数实现卡片浏览工具的具体代码,供大家参考,具体内容如下一、实现效果通过拖拽屏幕实现卡片移动,左右两侧的卡片随着拖动变小,中间... [阅读全文]
验证码:
移动技术网