Ios 如何通过整数获得垂直和水平对齐?
我正在尝试将整数值转换为内容对齐方式。整数可以同时保持水平对齐和垂直对齐 首先,我创建了一个枚举,它描述了所有的可能性(我必须使用android Gravity类的值:) 因此,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
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,但是。。。没有办法用不合适的值(这些是)进行位屏蔽,我不是在扮演聪明的驴。如果他需要使用这些值,那么应该采取其他方法(直接比较?数组?等等)。我在回答中说明了如何做到这一点。这几乎就是他所做的,除了他只是用了错误的值。它不是在单个位级别进行位掩蔽,而是掩蔽一系列位以进行比较。