La raison pour laquelle cela ne fonctionne pas est due au mélange de deux syntaxes.
Tout d'abord, vous avez "." comme raccourci pour appeler les fonctions d'accès (une caractéristique de l'Objective-C). Ainsi,
- a.b devient [a getB] ;
- a.b = 5 devient [a setB:5] ;
Et puis il y a "." comme accès direct aux membres de la structure (pur C). Donc
- A.B. est vraiment A.B ;
- a.b est réellement a.b = 5 ;
La combinaison de ces éléments dans un cas d'ensemble de valeurs comme celui-ci ne fonctionne pas.
Parce que... Si vous pouviez appeler
myView.frame.origin.x = 25.0;
-
La partie "myView.frame" est égale à [myView getFrame] et vous obtenez un cadre CGRect copié (une structure C).
-
Le "myView.frame.origin" vous donne un CGPoint d'origine (également un struct) du CGRect copié.
-
Le "myView.frame.origin.x = 25.0" vous donne un CGFloat x de l'origine et maintenant vous voulez lui attribuer quelque chose et voilà le problème...
Vous essayez de définir une variable d'un struct d'un struct, ce qui est correct, mais il n'y a pas de pointeur de l'UIView vers le struct, il est donc copié à la place. Donc vous copiez et ensuite vous définissez et ensuite vous vous attendez à ce que l'action de définition soit en quelque sorte transmise par le get initial à la UIView, et bien cela ne fonctionne pas.
Bien sûr, vous pouvez vous demander pourquoi Apple n'a pas simplement créé un raccourci, de sorte qu'à la fin, votre cadre copié est automatiquement réinjecté dans un appel setFrame ajouté automatiquement, je suppose que vous devez vivre avec la situation actuelle.
Rappelez-vous, cela fonctionnerait si vous obteniez un pointeur vers le cadre, mais ce n'est pas le cas, vous obtenez une structure copiée à la place.
Donc si vous attendez myView.frame.origin.x = 25.0
pour fonctionner, vous vous attendez indirectement à ce que votre appel soit automatiquement traduit en une sorte d'outil d'aide à la décision.
[myView setFrame:[myView getFrame:frame].origin.x = 25.0]
.
Eh bien, je suppose que tu peux admettre que ça a l'air mauvais.
Imaginez également que vous obteniez un pointeur direct sur le cadre CGRect et que vous changiez quelque chose à travers ce pointeur, comment l'UIView saurait-il que sa taille a changé et qu'il doit se mettre à jour ? Si, par contre, un appel à [myView setFrame:newFrame] est effectué, alors l'UIView peut effectuer lui-même tous les réajustements nécessaires.