在钢琴应用程序中,我正在分配黑键的坐标。这是导致错误的代码行。
'blackKey' 和 'whiteKey' 都是 customViews
blackKey.center.x = (whiteKey.frame.origin.x + whiteKey.frame.size.width);
在钢琴应用程序中,我正在分配黑键的坐标。这是导致错误的代码行。
'blackKey' 和 'whiteKey' 都是 customViews
blackKey.center.x = (whiteKey.frame.origin.x + whiteKey.frame.size.width);
其他答案并不能完全解释这里发生了什么,所以这是基本问题:
当您编写blackKey.center.x
时,blackKey.center
andcenter.x
看起来像结构成员访问,但它们实际上是完全不同的东西。blackKey.center
是一个属性访问,它对类似的东西脱糖[blackKey center]
,而后者又对类似的东西脱糖objc_msgSend(blackKey, @selector(center))
。你不能修改函数的返回值,比如objc_msgSend(blackKey, @selector(center)).x = 2
——它只是没有意义,因为返回值没有存储在任何有意义的地方。
所以如果要修改struct,就得把属性的返回值存储在一个变量中,修改变量,然后将属性设置为新的值。
如果它是对象的属性,则不能像这样直接更改x
a 的值(或结构的任何值)。CGPoint
执行以下操作。
CGPoint _center = blackKey.center;
_center.x = (whiteKey.frame.origin.x + whiteKey.frame.size.width);
blackKey.center = _center;
blackKey.center = CGPointMake ( whiteKey.frame.origin.x + whiteKey.frame.size.width, blackKey.center.y);
一种方法。
就其含义而言,您不能为表达式赋值。例如,a + b = c 是禁止的。
使用宏的一种替代方法:
#define CGPOINT_SETX(point, x_value) { \
CGPoint tempPoint = point; \
tempPoint.x = (x_value); \
point = tempPoint; \
}
#define CGPOINT_SETY(point, y_value) { \
CGPoint tempPoint = point; \
tempPoint.y = (y_value); \
point = tempPoint; \
}
CGPOINT_SETX(blackKey.center, whiteKey.frame.origin.x + whiteKey.frame.size.width);
或者稍微简单一点:
CGPOINT_SETX(blackKey.center, CGRectGetMaxX(whiteKey.frame));