objective-c - origin - uiview frame cgrect




"Expression non è assegnabile"-Problema nell'assegnazione di float come somma di altri due float in xCode? (3)

In un'app di pianoforte, sto assegnando le coordinate dei tasti neri. Ecco la riga di codice che causa l'errore.

"blackKey" e "whiteKey" sono entrambi personalizzati

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

Le altre risposte non spiegano esattamente cosa sta succedendo qui, quindi questo è il problema di base:

Quando scrivi blackKey.center.x , blackKey.center e center.x sembrano entrambi accessi ai membri della struct, ma in realtà sono cose completamente diverse. blackKey.center è un accesso di proprietà, che desugars a qualcosa come [blackKey center] , che a sua volta desugars a qualcosa come objc_msgSend(blackKey, @selector(center)) . Non è possibile modificare il valore di ritorno di una funzione, ad esempio objc_msgSend(blackKey, @selector(center)).x = 2 - non è significativo, perché il valore restituito non è memorizzato in alcun luogo significativo.

Quindi, se si desidera modificare la struttura, è necessario memorizzare il valore restituito della proprietà in una variabile, modificare la variabile e quindi impostare la proprietà sul nuovo valore.


Non è possibile modificare direttamente il valore x di un CGPoint (o qualsiasi valore di una struttura) in questo modo, se è una proprietà di un oggetto. Fai qualcosa come il seguente.

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

Un'alternativa usando le macro:

#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);

o leggermente più semplice:

CGPOINT_SETX(blackKey.center, CGRectGetMaxX(whiteKey.frame));






cgrect