如何通过整数获得垂直和水平对齐?

时间:2013-06-07 13:06:04

标签: ios objective-c alignment bit-shift bitmask

我正在尝试将整数值转换为内容对齐方式。整数可以同时保持水平和垂直对齐。

首先我创建了一个enum,它描述了所有可能性(我必须使用android Gravity类的值:http://developer.android.com/reference/android/view/Gravity.html

typedef enum{
    GravityHorizontalCenter         = 1,    // (0x00000001) 
    GravityLeft                     = 2,    // (0x00000002) 
    GravityRight                    = 5,    // (0x00000005) 
    GravityVerticalCenter           = 16,   // (0x00000010) 
    GravityTop                      = 48,   // (0x00000030) 
    GravityBottom                   = 80,   // (0x00000050) 
} GravityType;

所以int alignment = GravityRight | GravityTop将是53。

我想检查我的视图对象的对齐方式:

if ((textAlignment & GravityHorizontalCenter) == GravityHorizontalCenter){

    return NSTextAlignmentCenter;
}...

但似乎缺少某些东西,因为对于53 if语句textAlignment & GravityHorizontalCenter) == GravityHorizontalCenter返回True

2 个答案:

答案 0 :(得分:2)

您需要垂直和水平范围的遮罩。

typedef enum{
    GravityHorizontalCenter         = 1,    // (0x00000001) 
    GravityLeft                     = 2,    // (0x00000002) 
    GravityRight                    = 5,    // (0x00000005) 
    GravityHorizontalMask           = 7,    // (0x00000007) 
    GravityVerticalCenter           = 16,   // (0x00000010) 
    GravityTop                      = 48,   // (0x00000030) 
    GravityBottom                   = 80,   // (0x00000050) 
    GravityVerticalMask             = 112,  // (0x00000070) 
} GravityType;

然后你可以用:

进行测试
(textAlignment & GravityHorizontalMask) == GravityHorizontalCenter

(textAlignment & GravityVerticalMask) == GravityTop

这些值仅适用于直接比较,因为5(101二进制)和1(001二进制)重叠为位掩码。但由于您要存储两个相同数字的值(水平对齐的前4位,垂直对齐的后4位),您需要一个掩码来隔离要比较的位范围。

另外,你应该知道在Android上LEFT(左重力常数)的值是3而不是2.所以如果你的枚举真的需要与Android兼容,那么你的GravityLeft价值可能不正确。

答案 1 :(得分:1)

因为这些值不适合用作位标志(掩码)。

&不是魔法 - 它只是按位AND运算符。如果您按AND数字1,则将结果与1进行比较,只检查原始数字中是否设置了最低有效位,即i。即如果它是奇怪的。因此,(textAlignment & GravityHorizontalCenter) == GravityHorizontalCenter将为任何奇数生成真。

如果你想使用数字作为标志,你必须使它们具有不同的2的幂,如下所示:

GravityHorizontalCenter         = 1,
GravityLeft                     = 2,
GravityRight                    = 4,
GravityVerticalCenter           = 8,
GravityTop                      = 16,
GravityBottom                   = 32,