iOS 位枚举

在 iOS 开发中,我们使用系统的枚举定义的时候,经常可以看到位枚举

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
    UIControlStateApplication  = 0x00FF0000,              // additional flags available for application use
    UIControlStateReserved     = 0xFF000000               // flags reserved for internal framework use
};

需要掌握位枚举,我们需要先了解位运算位移

位运算

位运算有两种:位或(|)位与(&)

  • 位或(|) :两个进行或(|)运算。运算规则:两个运算的只要有一个为1则运算结果为1,否则为0

如:
0000 0001 | 0000 0010 结果为:0000 0011
0000 0000 | 0000 0000 结果为:0000 0000

  • 位与(&) :两个进行与(&)运算。运算规则:两个运算的都为1则运算结果为1,否则为0

如:
0000 0001 & 0000 0001 结果为:0000 0001
0000 0001 & 0000 0010 结果为:0000 0000

位移

位移包含两种:左移(<<)右移(>>)

  • << :将一个数的二进制位向左移动 n 位,高位丢弃,低位补 0。如将数字1(0000 0001)左移两位得到结果为:4(0000 0100)。表述为:1 << 2。
    > 左移就是将一个数乘以 2 的 n 次方。
  • >> :将一个数的二进制位向右移动 n 位,低位丢弃,高位补 0。如将数字4(0000 0100)右移两位得到结果为:1(0000 0001)。表述为:4 >> 2。
    > 右移就是将一个数除以 2 的 n 次方。

iOS 位枚举

我们有如下定义:

typedef NS_ENUM(NSUInteger, HJDirection) {
    // 0000 0001
    HJDirectionLeft = 1 << 0,
    // 0000 0010
    HJDirectionRight = 1 << 1,
    // 0000 0100
    HJDirectionTop = 1 << 2,
    // 0000 1000
    HJDirectionBottom = 1 << 3
};

PS:定义一个位枚举时,我们通常以一个数字作为基准,如数字1,然后对该数字进行左移(右移),这样我们才能在后面使用中判断是否包含某个枚举值。

使用:

//获取所有方向(位或运算)
//0000 1111
HJDirection directionAll = HJDirectionLeft | HJDirectionRight | HJDirectionTop | HJDirectionBottom;

//获取是否包含某个方向(位与运算)
if ((directionAll & HJDirectionLeft) == HJDirectionLeft) {
    //0000 0001
    NSLog(@"满足条件:左方向");
}
if ((directionAll & HJDirectionRight) == HJDirectionRight) {
    //0000 0010
    NSLog(@"满足条件:右方向");
}
if ((directionAll & HJDirectionTop) == HJDirectionTop) {
    //0000 0100
    NSLog(@"满足条件:上方向");
}
if ((directionAll & HJDirectionBottom) == HJDirectionBottom) {
    //0000 1000
    NSLog(@"满足条件:下方向");
}

我们回到开始的 UIControlState 枚举定义

我们在定义 UIButton 状态时,一般会用到 UIControlStateNormalUIControlStateHighlightedUIControlStateSelected,但我们怎么去定义一个选中状态下的高亮呢?如果我们单纯的使用 UIControlStateHighlighted, 我们得到的只是默认状态下的高亮显示。这时我们就需要用到位枚举的神奇之处了。

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setTitle:@"点击我" forState:UIControlStateNormal];
//定义普通状态文字颜色
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
//定义选中状态文字颜色
[button setTitleColor:[UIColor blueColor] forState:UIControlStateSelected];
//定义普通状态高亮文字颜色
[button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
//定义选中状态高亮文字颜色
[button setTitleColor:[UIColor orangeColor] forState:UIControlStateSelected | UIControlStateHighlighted];

Done !

Link:iOS 位枚举

时间: 2024-12-22 13:25:05

iOS 位枚举的相关文章

iOS 关于枚举的使用

引言: 枚举值 它是一个整形(int)  并且,它不参与内存的占用和释放,枚举定义变量即可直接使用,不用初始化. 在代码中使用枚举的目的只有一个,那就是增加代码的可读性. 使用: 枚举的定义如下: typedef enum { //以下是枚举成员 TestA = 0, TestB, TestC, TestD }Test;//枚举名称 亦可以如下定义(推荐:结构比较清晰): typedef NS_ENUM(NSInteger, Test1) { //以下是枚举成员 Test1A = 0, Test

iOS开发之枚举用法小结_IOS

前言 Enum,也就是枚举,从C语言开始就有了,C++.Java.Objective-C.Swift这些语言,当然都有对应的枚举类型,功能可能有多有少,但是最核心的还是一个-规范的定义代码中的状态.选项等"常量". 举个例子,我们想要在开发中根据四季的变化做不同的操作,我们首先想到的可能会是定义一个int型变量,通过为该变量赋不同的值来表示四季(e.g. 1为春天,2为夏天,3为秋天,4为冬天).但是,对于阅读该份代码的人来讲,他们并不能在短时间内就明白数字1234所代表的具体含义.这

C#字符串工具类 截取、过滤、格式判断等

  C#字符串工具类,实现的功能包括:判断某值是否在枚举内(位枚举).将全角数字转换为数字.判断是否为IP.获得当前页面客户端的IP.改正sql语句中的转义字符.检测是否是正确的Url.检测是否符合email格式.SQL字符串过滤.按字节数截取字符串(不带省略号).按字节数截取字符串(后面加省略号...)等. view sourceprint?001using System; 002using System.Collections.Generic; 003using System.Linq; 0

请教一个穷举的算法:)列出字符串

问题描述 问题描述:现在想从ABCD四个字符想穷举后得到:ABCDAAABACADAAAAABAACAADABAABBABCABDACAACBACCACDADAADBADCADD.....DDDDD等等,不计各个位数,但最长的长度为5即DDDDD,求出各种字符组合.请教高手指点:) 解决方案 解决方案二:四进制!!!代码就不用写了吧解决方案三:请问要怎么做四进制呢?还有要是如果字符更多,穷举的长度也变长呢?请教:)解决方案四:又是一个全排列问题.解决方案五:楼上的有好招么?请教:)解决方案六:[

Objective-C使用位运算设计可复选的枚举

使用位运算设计可复选的枚举 一.枚举使用的一个小例子         在软件开发中,枚举是我们会经常会用到的一种编程方式,通过枚举,可以使我们的代码更具可读性与统一性.通常情况下,我们会通过typedef来定义一种枚举的类型来使用.例如: ? 1 2 3 4 5 typedef enum {     para1,     para2,     para3 }myEnum; 我们可以在函数的参数中来使用它: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1

iOS - Swift Enum 枚举

前言 枚举声明的类型是囊括可能状态的有限集,且可以具有附加值.通过内嵌(nesting),方法(method),关联值(associated values) 和模式匹配(pattern matching) 枚举可以分层次地定义任何有组织的数据. 和 switch 语句类似,Swift 中的枚举乍看之下更像是 C 语言中枚举的进阶版本,即允许你定义一种类型,用于表示普通事情中某种用例.不过深入挖掘之后,凭借 Swift 背后特别的设计理念,相比较 C 语言枚举来说其在实际场景中的应用更为广泛.特别

iOS - OC Enum 枚举

前言 iOS 5.0 之后,提供了新的枚举定义方式,定义枚举的同时,可以指定枚举中数据的类型. typedef NS_OPTIONS(_type, _name) new; -> 位移的,可以使用 按位或 设置数值 typedef NS_ENUM(_type, _name) new; -> 数字的,直接使用枚举设置数值 位移型枚举: 使用 按位或 可以给一个参数同时设置多个 "类型".在具体执行的时候,使用 按位与 可以判断具体的 "类型". OC 中 6

IOS中用正则表达式判断输入的内容为8-16位且同时包含数字和字母

今天在项目中需要用到判断用户输入的用户名长度为8-16位且同时包含数字和字母,在网上搜了一下正则表达式的用法,然后参考这篇blog,完美解答了问题.记录一下: 密码有如下要求:由数字和字母组成,并且要同时含有数字和字母,且长度要在8-16位之间. 如何分析需求?拆分!这就是软件设计的一般思路了.于是乎,拆分需求如下: 1,不能全部是数字 2,不能全部是字母 3,必须是数字或字母 只要能同时满足上面3个要求就可以了,写出来如下: 1 ^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-

第十三章 枚举类型与位标记[《.net框架程序设计》读书笔记]

.net框架|笔记|程序|设计 第十三章 枚举类型与位标记 一. 枚举类型 1. 使用枚举类型的理由: l 枚举类型是得程序更容易编写.阅读.维护,在代码中使用符号名称代替数字是程序设计的一贯主张. l 强类型的,便于类型检验 2. 注意事项: l 枚举类型继承自System.Enum,System.Enum又继承自System.ValurType l 枚举类型不能定义方法.属性.事件 l 枚举类型为常数而非只读字段,因此可能引入版本问题(见第八章的相关讨论) l 将枚举类型与引用它的类型定义在