41

在钢琴应用程序中,我正在分配黑键的坐标。这是导致错误的代码行。

'blackKey' 和 'whiteKey' 都是 customViews

blackKey.center.x = (whiteKey.frame.origin.x + whiteKey.frame.size.width);
4

5 回答 5

82

其他答案并不能完全解释这里发生了什么,所以这是基本问题:

当您编写blackKey.center.x时,blackKey.centerandcenter.x看起来像结构成员访问,但它们实际上是完全不同的东西。blackKey.center是一个属性访问,它对类似的东西脱糖[blackKey center],而后者又对类似的东西脱糖objc_msgSend(blackKey, @selector(center))。你不能修改函数的返回值,比如objc_msgSend(blackKey, @selector(center)).x = 2——它只是没有意义,因为返回值没有存储在任何有意义的地方。

所以如果要修改struct,就得把属性的返回值存储在一个变量中,修改变量,然后将属性设置为新的值。

于 2011-08-16T06:49:06.577 回答
19

如果它是对象的属性,则不能像这样直接更改xa 的值(或结构的任何值)。CGPoint执行以下操作。

CGPoint _center = blackKey.center;
_center.x =  (whiteKey.frame.origin.x + whiteKey.frame.size.width);
blackKey.center = _center;
于 2011-08-16T06:42:49.357 回答
10
blackKey.center = CGPointMake ( whiteKey.frame.origin.x + whiteKey.frame.size.width, blackKey.center.y);

一种方法。

于 2011-08-16T06:41:01.133 回答
0

就其含义而言,您不能为表达式赋值。例如,a + b = c 是禁止的。

于 2019-08-13T11:25:08.053 回答
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));
于 2015-09-09T03:25:00.147 回答