Il motivo per cui questo non funziona è dovuto al mixaggio di due sintassi.
Prima di tutto "." come scorciatoia per chiamare le funzioni accessorie (una funzione Objective-C). Quindi
- a.b diventa [a getB];
- a.b = 5 diventa [a setB: 5];
E poi c'è "."Come l'accesso diretto struct membro (puro C) Così
- ab è davvero ab;.
- ab è davvero ab = 5;
Combinando questo in un set-value-caso come questo , non funziona.
Perché ... Se si potrebbe chiamare
myView.frame.origin.x = 25.0;
La parte "myView.frame" è uguale a [myView GetFrame] e si ottiene un telaio CGRect copiato (un C struct)
Il "myView.frame.origin" ti dà origine CGPoint (anche una struct) del copiato CGRect
il "myView.frame.origin.x = 25,0" ti dà una CGFloat x dell'origine e ora si desidera assegnare qualcosa ad esso e qui viene il problema ...
Si tenta di impostare una variabile di una struttura di una struct, che è ok, ma non vi è alcun puntatore da UIView alla struct, quindi viene invece copiato. Quindi copi e poi imposti e poi ti aspetti che l'azione del set venga in qualche modo inoltrata attraverso l'iniziale di arrivare a UIView, beh, e questo semplicemente non funziona.
Ovviamente ci si potrebbe chiedere perché Apple non abbia appena creato una scorciatoia, in modo che alla fine il fotogramma copiato venga automaticamente reinserito in una chiamata setFrame con l'aggiunta automatica, immagino che devi solo vivere con quello che è.
Quindi ricorda che funzionerebbe se avessi un puntatore al frame, ma non lo fai, ottieni invece una struct copiata.
Quindi, se si prevede che myView.frame.origin.x = 25.0
funzioni, la tua chiamata verrà automaticamente tradotta in una sorta di
[myView setFrame:[myView getFrame:frame].origin.x = 25.0]
.
Beh, immagino che si possa ammettere che questo sembra sbagliato.
Immaginate anche se otterreste un puntatore diretto al frame CGRect e cambiereste qualcosa attraverso quel puntatore, in che modo l'UIView saprebbe che le sue dimensioni sono cambiate e che deve aggiornarsi? Se invece viene effettuata una chiamata [myView setFrame: newFrame], quindi UIView può eseguire tutto il necessario riaggiustamento.
+1 - Mi stavo chiedendo per un po 'di tempo ora .. – Emil