typedef NS_OPTIONS检查像UIViewAutoresizing

时间:2012-11-04 09:47:50

标签: ios typedef

简要介绍我想用此实现的目标:
我有一个自定义UIView,我想让箭头可见,例如在底部和左侧。 我认为可以像UIViewAutoresizing那样做到这一点。

所以我为自定义视图创建了一个类似的typedef

typedef NS_OPTIONS(NSUInteger, Arrows) {
    ArrowNone      = 0,
    ArrowRight     = 1 << 0,
    ArrowBottom    = 1 << 1,
    ArrowLeft      = 1 << 2,
    ArrowTop       = 1 << 3
};

同样在我的自定义视图头文件中,我添加了:

@property (nonatomic) Arrows arrows;

这一切都有效,现在我可以设置属性:
customview.arrows = (ArrowBottom | ArrowLeft);

返回6

现在是我的问题,如何检查我的arrows属性是否包含左下角? 我试过了:

if (self.arrows == ArrowLeft) {
    NSLog(@"Show arrow left");
}

这没有做任何事情。还有另一种检查方法吗?

3 个答案:

答案 0 :(得分:36)

检查位掩码的正确方法是使用AND(&amp;)运算符解码值,如下所示:

Arrows a = (ArrowLeft | ArrowRight);    
if (a & ArrowBottom) {
   NSLog(@"arrow bottom code here");    
}

if (a & ArrowLeft) {
   NSLog(@"arrow left code here");    
}    

if (a & ArrowRight) {
   NSLog(@"arrow right code here");    
}

if (a & ArrowTop) {
   NSLog(@"arrow top code here");    
}

这将在控制台中打印出来:

arrow left code here
arrow right code here

答案 1 :(得分:5)

要进行复合检查,您可以使用以下代码:

if ((a & ArrowRight) && (a & ArrowTop)) {
       NSLog(@"arrow right and top code here");    
}

答案 2 :(得分:5)

检查此值的正确方法是首先按位AND值和 然后检查是否与所需值相等。

Arrows a = (ArrowBottom | ArrowLeft);    
if (((a & ArrowBottom) == ArrowBottom) && ((a & ArrowLeft) == ArrowLeft)) {
    // arrow bottom-left
}

以下参考资料解释了为什么这是正确的,并提供了枚举类型的其他见解。

参考:checking-for-a-value-in-a-bit-mask