Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何通过整数获得垂直和水平对齐?_Ios_Objective C_Alignment_Bit Shift_Bitmask - Fatal编程技术网

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

Ios 如何通过整数获得垂直和水平对齐?,ios,objective-c,alignment,bit-shift,bitmask,Ios,Objective C,Alignment,Bit Shift,Bitmask,我正在尝试将整数值转换为内容对齐方式。整数可以同时保持水平对齐和垂直对齐 首先,我创建了一个枚举,它描述了所有的可能性(我必须使用android Gravity类的值:) 因此,int alignment=GravityRight | GravityTop将是53 我想检查视图对象的对齐方式,如下所示: if ((textAlignment & GravityHorizontalCenter) == GravityHorizontalCenter){ return NSText

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

首先,我创建了一个枚举,它描述了所有的可能性(我必须使用android Gravity类的值:)

因此,
int alignment=GravityRight | GravityTop
将是53

我想检查视图对象的对齐方式,如下所示:

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

    return NSTextAlignmentCenter;
}...
GravityHorizontalCenter         = 1,
GravityLeft                     = 2,
GravityRight                    = 4,
GravityVerticalCenter           = 8,
GravityTop                      = 16,
GravityBottom                   = 32,

但是似乎缺少了一些东西,因为对于53,if语句
textAlignment&GravityHorizontalCenter)==GravityHorizontalCenter
返回
True
,因为这些值不适合用作位标志(掩码)

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

如果要使用数字作为标志,必须使其具有不同的二次幂,如下所示:

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

    return NSTextAlignmentCenter;
}...
GravityHorizontalCenter         = 1,
GravityLeft                     = 2,
GravityRight                    = 4,
GravityVerticalCenter           = 8,
GravityTop                      = 16,
GravityBottom                   = 32,

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

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

这些值实际上只适合直接比较,因为5(101二进制)和1(001二进制)作为位掩码重叠。但是,由于将两个值存储在同一个数字中(第一个4位用于水平对齐,第二个4位用于垂直对齐),因此需要一个掩码来隔离要比较的位的范围


另外,您应该注意,在Android上,
LEFT
(左侧重力常数)的值是3,而不是2。因此,如果您的enum确实需要与Android兼容,那么您的
GravityLeft
值可能不正确

你想用你的单曲
&
做什么?@Firo哦,太酷了,我不知道这有一个语法!我会记住这一点!也许有必要解释一下原因。@Chrizzor我不知道你在问什么。我向你展示了如何测试我答案中的值。您可以使用水平或垂直蒙版编辑对齐,然后将结果与您试图匹配的值进行比较。@James抱歉,忘记我的最后一条评论。非常感谢你的帮助,现在一切都很顺利!你说的可能是真的,但这对OP来说并不是特别有用,因为他需要使用他拥有的数字来与Android兼容。@JamesHolderness,但是。。。没有办法用不合适的值(这些是)进行位屏蔽,我不是在扮演聪明的驴。如果他需要使用这些值,那么应该采取其他方法(直接比较?数组?等等)。我在回答中说明了如何做到这一点。这几乎就是他所做的,除了他只是用了错误的值。它不是在单个位级别进行位掩蔽,而是掩蔽一系列位以进行比较。