ピアノアプリでは、黒のキーの座標を割り当てています。エラーの原因となっているコード行は次のとおりです。
「blackKey」と「whiteKey」は両方ともcustomViewsです
blackKey.center.x = (whiteKey.frame.Origin.x + whiteKey.frame.size.width);
他の答えは、ここで何が起こっているかを正確に説明していないため、これが基本的な問題です。
_blackKey.center.x
_を記述すると、_blackKey.center
_と_center.x
_は両方とも構造体メンバーアクセスのように見えますが、実際には完全に異なるものです。 _blackKey.center
_はプロパティアクセスであり、_[blackKey center]
_のようなものに脱糖され、次にobjc_msgSend(blackKey, @selector(center))
のようなものに脱糖されます。 objc_msgSend(blackKey, @selector(center)).x = 2
のように、関数の戻り値を変更することはできません。戻り値はstoredのどこにも意味がないため、意味がありません。
したがって、構造体を変更する場合は、プロパティの戻り値を変数に保存し、変数を変更してから、プロパティを新しい値に設定する必要があります。
オブジェクトのプロパティである場合、x
(または構造体の値)の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);
それを行う1つの方法。
マクロを使用する1つの選択肢:
#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));
その意味として、値を式に割り当てることはできません。たとえば、a + b = cは禁止されています。