跳过正文
  1. Posts/

UIButton 状态小结

·2 分钟

案例
#

我们先从一个问题说起,小明同学接到产品的一个新需求:实现一个 UIButton,要求在 normal、selected、highlighted 三种状态下展示不同文案。这简直太简单了,小明同学1分钟不到就实现了,关键代码如下:

[button setTitle:@"normal" forState:UIControlStateNormal];
[button setTitle:@"highlighted" forState:UIControlStateHighlighted];
[button setTitle:@"selected" forState:UIControlStateSelected];

这段代码有什么问题吗?

的确有问题!当 button 状态为 selected 时,点击按钮,文案展示 normal,当前状态应该是 UIControlStateHighlighted,怎么展示了 UIControlStateNormal 的文案?

问题分析
#

UIButton 有5种状态,分别是:default(normal), highlighted, focused, selected, disabled,通过属性 state 可以拿到当前状态值 UIControlState,定义如下:

@property(nonatomic,readonly) UIControlState state;                  // could be more than one state (e.g. disabled|selected). synthesized from other flags.

typedef NS_OPTIONS(NSUInteger, UIControlState) {
    UIControlStateNormal       = 0,
    UIControlStateHighlighted  = 1 << 0,                  // used when UIControl isHighlighted is set
    UIControlStateDisabled     = 1 << 1,
    UIControlStateSelected     = 1 << 2,                  // flag usable by app (see below)
    UIControlStateFocused NS_ENUM_AVAILABLE_IOS(9_0) = 1 << 3, // Applicable only when the screen supports focus
};

看到位运算我们就可以猜到这个状态可以组合,而且有句很关键的注释:

could be more than one state (e.g. disabled|selected). synthesized from other flags. state 不是单独的状态,可以是多种状态的混合。

我们在回到上面的小明同学遇到的问题,当 button 状态为 selected 时,点击按钮,按钮此时的状态其实是 UIControlStateHighlighted | UIControlStateSelected。在官方文档中,我们可以看到这么一句话:

If a title is not specified for a state, the default behavior is to use the title associated with the UIControlStateNormal state

也就是说小明同学其实漏设置了一种状态,然后系统展示了按钮的默认状态 UIControlStateNormal,按钮状态并不是是 UIControlStateNormal

小结
#

1、UIControlState 是个组合状态,在 setTitle:forState:setImage:forState: 时,如果需要自定义 UIControlStateSelected 状态,一定要注意自定义 UIControlStateHighlighted | UIControlStateSelected。 2、如果按钮的当前状态没有自定义,使用 UIControlStateNormal 定义的值。

相关文章

2019年iOS面试攻略

··5 分钟
笔者工作经验4年,经过一年的精心准备,拿到了字节跳动和腾讯的 Offer,在这里分享一下我的一些心得,希望能帮助到有需要的同学。 一、摆正心态 # 我加了好几个 iOS 技术交流群,发现大家都有一个共识 ”iOS 没人要了“ 😂,其实很大部分是大佬们的自嘲(当真你就输了),不过也从侧面印证出移动端开发市场的要求越来越高,加上市场大环境不好,想要斩获大厂 Offer 难度越来越大。

GCD 解决生产者消费者问题

·2 分钟
说起生产者消费者问题(Producer-consumer problem),相信大家都印象深刻,有遗忘可以看看wiki上的解释,我们今天来聊聊怎么用 GCD 实现一个生产者消费者模型。 我们先理一下思路,看看问题关键点:

connectionProxyDictionary 笔记

·1 分钟
最近研究了下 connectionProxyDictionary,做一个简单的笔记。官方文档是这么描述的。 This property controls which proxy tasks within sessions based on this configuration use when connecting to remote hosts. The default value is NULL, which means that tasks use the default system settings.

iOSer 大厂 Offer 攻略

··5 分钟
笔者工作经验4年,毕业之后一直梦想着进入大厂工作,一直朝着这个目标努力。经过一年的精心准备,拿到了字节跳动的 Offer,在这里分享一下我的一些心得,希望能帮助到有需要的同学。

NSURLCache 缓存机制浅谈

·3 分钟
APP 中有很多从服务器获取数据、资源的需求,为了节省流量、加快访问速度、离线使用等需求,就会使用到网络缓存。HTTP协议对于缓存设计了很多机制,感兴趣的同学可以看看《RFC2616-section13-Caching in HTTP》。