Objective-C 里的枚举有两种类型:NS_ENUM 和 NS_OPTIONS,本质上是一样的,都是枚举。
NS_ENUM
typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
UITableViewCellStyleDefault,
UITableViewCellStyleValue1,
UITableViewCellStyleValue2,
UITableViewCellStyleSubtitle
};
NS_OPTIONS
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
UIViewAutoresizingNone = 0,
UIViewAutoresizingFlexibleLeftMargin = 1 << 0,
UIViewAutoresizingFlexibleWidth = 1 << 1,
UIViewAutoresizingFlexibleRightMargin = 1 << 2,
UIViewAutoresizingFlexibleTopMargin = 1 << 3,
UIViewAutoresizingFlexibleHeight = 1 << 4,
UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};
NS_ENUM 这种声明出来的东西大部分是单选, NS_OPTIONS 声明出来的大部分是多选。
像 UITableViewCellStyle 这种在用的时候肯定是只能选一种样式,要么 style 是 Default,要么是 Subtitle 或者 Value1 或者 Value2 等等,你的 Cell 不可能既是 Default 类型,又是 Subtitle 类型。
但是 UIViewAutosizing 就不一样了。我要是让子视图的宽高和父视图一样,那么 autoviewsizing 的选项肯定是类似于这种。
UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight
意思就是两个 options 的我都得选才行。
那么如果有个场景让我判断当前的 View 的 Autoresizing 有哪几个,我怎么判断呢?
很简单,用按位与操作就行了。
autoResizings = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin;
我们判断 autoResizings 里是否有 UIViewAutoresizingFlexibleLeftMargin 的时候只需要判断下面的是否为 true 就可以了。
// 是否为 true 就可以了
if (autoResizings & UIViewAutoresizingFlexibleLeftMargin)
Tips:有些语言并不像 Objective-C 非 0 即真,比如 Swift 等。(今天就遇到了这个小坑)
用二进制表示
UIViewAutoresizingFlexibleLeftMargin = 00000001
UIViewAutoresizingFlexibleWidth = 00000010
UIViewAutoresizingFlexibleRightMargin = 00000100
所以根据上面的表达式,我们的 autoResizings = 00000111,
那么执行按位与操作是这样的。
if (00000111 & 00000001)
结果就是 00000001,为 true,表示含有这个选项。