20

简要介绍我想用这个实现什么:
我有一个自定义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");
}

这没有做任何事情。还有其他方法可以检查吗?

4

3 回答 3

36

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

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
于 2012-12-11T11:43:46.257 回答
5

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

if ((a & ArrowRight) && (a & ArrowTop)) {
       NSLog(@"arrow right and top code here");    
}
于 2014-07-25T21:22:56.690 回答
5

检查此值的正确方法是先将这些值按位与,然后检查是否与所需值相等。

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

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

参考:检查位掩码中的值

于 2015-04-27T00:47:49.913 回答