iOS 探讨之 UIButton State 神坑
简述
对于一些平常不太关注的事情来说,我们认为其的发生是理所当然,当问题蹦出后,“我靠( ‵o′)凸,按道理不应该这样啊 ~ ” 随之而出。
这次,我就被 UIButton 的 State 狠狠调戏了一番。
探讨
初次认知 UIButton 的时候我就会被其的各种状态折磨得头昏脑涨,后来随着见面次数的增加,慢慢了解到其的状态实际上是位的枚举集合。
那么,首先我们来瞜一眼苹果官方DOC。
Swift 版本 UIControl (UIButton直接父类) 的 State
从这个DOC中,我们可以认知到:
1 控件的状态是一个集合 (也就是说 可能同时存在 selected | disabled 的情况)
2 每一个状态对应一个 Int 值,可以通过 Int 值来反推集合内部组成
3 iOS 9以后 又添加了几种枚举 (逻辑更加复杂了,我们暂时不考虑它们)
Swift 版本 DOC 内部介绍并不是那么的完整,不过我依稀记得 OC 版本是有介绍的,让我们来欣赏一下 OC 版本DOC。
Objective-C 版本 UIControl (UIButton直接父类) 的 State
从这个DOC中,我们还可以认知到:
1 Selected 状态是存储在左起第三位
2 Disabled 状态是存储在左起第二位
3 Highlighted 状态是存储在左起第一位
4 Normal 状态是一种原始版本(对照版)
为了更直观认知上面的状态,我用了 storyboard 进行直观实验三种状态(Highlighted, Selected, Disabled)混合情况下所对应的真实样貌
1 通过右侧属性面板的设置,我设置了八组对照试验
(所有按钮的文字属性设置相同 (Default 为 “Normal”, Highlight 为 “Highlighted”, Selected 为 “Selected”, Disabled 为 “Disabled”))
2 所得出的数据表格
从上面我们可以看出:
1 当状态相互矛盾的时候,UIControl 控件会强制将自己的状态置为 Default (Normal)
2 当 Enable 关闭的时候,UIControl 控件会将 Highlight 强制置为关闭状态
3 真实的 State 是由多个状态组合而成
4 四种正常逻辑的试验对应着 Normal、Selected、Highlighted、Disabled 四种状态
延伸
1 如何处理这些逻辑上说不通的场景
单独给这些场景设置业务上要求的样式即可,如下方我们给 .selected | .disabled 设置内容
2 Swift 版集合操作符
union 并集 A∪B
intersection 交集 A∩B
symmetricDifference 对称差集 A△B={x|x∈A∪B, x∉A∩B}
引用
2 https://www.jianshu.com/p/e87096da5512
3 https://baike.baidu.com/item/%E5%AF%B9%E7%A7%B0%E5%B7%AE%E9%9B%86/1739582