在钢琴应用中,我正在指定黑键的坐标。 以下是导致错误的代码行。
'blackKey'和'whiteKey'都是customViews
blackKey.center.x = (whiteKey.frame.origin.x + whiteKey.frame.size.width);
答案 0 :(得分:82)
其他答案并没有准确解释这里发生了什么,所以这是基本问题:
当你写blackKey.center.x
时,blackKey.center
和center.x
看起来都像是结构成员访问,但它们实际上是完全不同的东西。 blackKey.center
是一种属性访问权限,可以访问类似[blackKey center]
的内容,而objc_msgSend(blackKey, @selector(center))
则会使objc_msgSend(blackKey, @selector(center)).x = 2
之类的东西变得荒谬。你不能修改函数的返回值,比如{{1}} - 它只是没有意义,因为返回值不是存储在任何有意义的地方。
因此,如果要修改结构,则必须将属性的返回值存储在变量中,修改变量,然后将该属性设置为新值。
答案 1 :(得分:19)
如果它是对象的属性,则不能直接更改x
(或结构的任何值)的CGPoint
值。做类似以下的事情。
CGPoint _center = blackKey.center;
_center.x = (whiteKey.frame.origin.x + whiteKey.frame.size.width);
blackKey.center = _center;
答案 2 :(得分:10)
blackKey.center = CGPointMake ( whiteKey.frame.origin.x + whiteKey.frame.size.width, blackKey.center.y);
一种方法。
答案 3 :(得分:0)
使用宏的另一种选择:
#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));
答案 4 :(得分:0)
就其含义而言,您不能为表达式分配值。例如,a + b = c是禁止的。