Dark Mode 暗黑模式
-
Dark Mode样式
- UIColor拥有了动态属性
-
iOS13之前只能表示一种颜色
-
iOS13以后能表示两种模式下不同颜色
-
初始化动态UIColor方法
这两个方法要求传一个block进去
当系统在和之间相互切换时就会触发此回调
这个block会返回一个类
-
我们需要使用其属性,它是一个枚举类型,会告诉我们当前是还是
-
颜色适配 示例:
-
图片也能在两种模式下自由切换
在里新建 右侧栏的,选择 -
图片适配 示例:
-
获取当前模式(Light or Dark)
-
设置App依旧保持原来样式 可通过设置plist完成
-
强行设置App模式
示例:
⚠️- 当强行设置当前VC为Dark Mode后,这个VC下的子视图都是Dark Mode模式
- 由这个VC Present/Push出的VC不会受到影响,依然跟随系统模式
- 要想一键设置App下所有的VC都是Dark Mode,可以直接设置window的UIUserInterfaceStyle(不推荐 推荐plist设置)
- 对window.rootViewController强行设置Dark Mode 也不会影响后续present除的VC的模式
- 根VC设置某个模式,继承的VC也会收到影响
- 要是先不适配暗黑模式的话,要么低版本Xcode出包,要么Xcode11里的plist设置Light模式
-
模拟器动态修改模式需要通过Xcode设置且debug状态才生效
-
监听模式切换
有时需要监听系统模式变化作出响应,通过以下方法
示例: -
CGColor适配
1.方式一:resolvedColor
示例:
2.方式二:performAsCurrent
示例:
3.方式三:最简单的方式
直接设置为一个动态UIColor的CGColor即可
⚠️! ! ! 设置layer颜色都是在traitCollectionDidChange中,意味着如果没有发生模式切换,layer将会没有颜色,需要设置一个基本颜色 -
模式切换时打印log设置
1.在Xcode菜单栏->->
2.选择->->
3.添加以下命令 NSAttributedString优化
-
不推荐做法
2.推荐做法
-
Status Bar设置
1.UIStatusBarStyleDefault 文字黑色
2.UIStatusBarStyleLightContent 文字白色
1.UIStatusBarStyleDefault 自动选择黑色或白色
2.UIStatusBarStyleDarkContent 文字黑色
3.UIStatusBarStyleLightContent 文字白色 -
UIActivityIndicatorView加载视图
1.UIActivityIndicatorViewStyleGray 灰色
2.UIActivityIndicatorViewStyleWhite 白色
3.UIActivityIndicatorViewStyleWhiteLarge 白色(大型)
1.UIActivityIndicatorViewStyleLarge (大型)
2.UIActivityIndicatorViewStyleMedium(中型)
3.可通过color属性设置其颜色
示例:
效果:
iOS13之前三种样式
iOS13以后的两种样式 -
模态弹出presentViewController
1.在iOS13中样式发生了变化,增加了一个,并且在iOS13中默认是这个值,而之前默认的是。自带手势下拉dismiss,弹出的vc适配可以在公共父类的init中设置为。⚠️!!! VC的高度也发生了变化,在viewdidload中和实际的高度是不一样的。
2.生命周期也有所不同
和不同,当A弹出B时,如果是,A是会调用disappear相关生命周期方法的,B dismiss时,A也会调用appear相关方法,而不会调用,所以想在A的这四个方法做事情的同学需要另辟蹊径了。 -
KVC不允许使用私有方法
比如UITextField设置placeholder
会直接crash
可以替换成
只需要使用空格占位,之后设置textF.placeholder就行 Xcode11新建工程的变化
iOS13工程结构发生了变化,有两个代理
- AppDelegate
- SceneDelegate
对应到方法就是一些Appdelegate里的方法以及一些可以注册监听的通知。
window放到里管理了,这是为ipad os做准备
如果想使用以前的场景,需要删除并且删除info.plist中Manifest,这样就走之前AppDelegate的那些方法了,并且别忘了在AppDelegate.h中添加属性
- 新增Menus控件
Menus可以嵌套UIAction 也可以嵌套UIMenu 如图
UIMenu对象:
其对应的有一个options参数,声明如下:
这个参数是用于第二层menu的,其对应和两个效果
效果如下
UIAction对象:
前三个参数就不说了,第四个参数 这个参数我目前没有研究出来是干嘛用的,如果有知道的小伙伴欢迎在评论区留言。
第五个参数 ,我们先来看下声明和效果图
也是 可以多个一起用,但是这几个组合都没用
第六个参数 ,一样先看声明和效果图。
可以和 搭配使用,如果 UIAction 设置了图片同时设置了 state = .on 则会把图片覆盖掉,只留下一个勾。
第七个参数是个闭包,当用户点击后会进入回调,处理相应的逻辑即可。
最后我们把 UIAction 和 editMenu 一起放到一个新的 UIMenu 中就可以达到动图中的效果了
-
Gestures 新特性
iOS13中 tableview和collectionview都增加了双指滑动编辑的功能
首先设置允许多选,再实现两个代理
当用户选择完,需要做某些操作时,我们可用 获取用户选择的。
-
编辑手势
1.复制:三指捏合
2.剪切:两次三指捏合
3.粘贴:三指松开
4.撤销:三指向左滑动(或三指双击)
5.重做:三指向右滑动
6.快捷菜单:三指单击
iOS13增加了一些文本编辑的手势,这些手势系统默认会提供,如果想禁用这些手势,需要重写属性,代码如下: -
search新特性
iOS13下 UISearchViewController 结构如下:
在中可以获取到了,可以修改field的颜色、字体等。
而且增加了Token功能,Token可以被复制、粘贴和拖拽,Token还有以下特点:
1.始终在普通文本面前
2.可以被选中和删除
Token创建的方式:
另外系统还提供 属性,来获取普通文本的长度。
还有 属性,该属性可以控制是否展示搜索结果控制器
-PDF(长图)
iOS13中可以把 scrollview 转成 image 再把 image 转成 PDF (类似Safari截图后 把整页HTML转成PDF存储)
实现:
在控制器中实现UIScreenshotServiceDelegate代理
⚠️! ! ! 如果是无限列表,不要使用此功能。
textView 光标移动交互变化
iOS13 输入框光标移动不再是摁住出现气泡移动 而是可以变成直接拖动光标的操作-
navigationBar的frame变化
纵坐标变成了0 所以需要处理一下
self.navigationController.navigationBar.hidden = YES;隐藏后 低版本纵坐标为电池条高度