J'essaye de comprendre les fonctionnalités de ces méthodes. Pouvez-vous me fournir un cas d'utilisation simple pour comprendre leur sémantique?
Dans la documentation, par exemple, la méthode convertPoint: fromView: est décrite comme suit:
Convertit un point du système de coordonnées d'une vue donnée en celui du récepteur.
Que signifie le système de coordonnées ? Et le récepteur ?
Par exemple, est-il logique d'utiliser convertPoint: fromView: comme ce qui suit?
CGPoint p = [view1 convertPoint:view1.center fromView:view1];
En utilisant l'utilitaire NSLog, j'ai vérifié que la valeur p coïncide avec le centre de view1.
Merci d'avance.
EDIT: pour ceux qui sont intéressés, j'ai créé un simple extrait de code pour comprendre ces méthodes.
UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 150, 200)];
view1.backgroundColor = [UIColor redColor];
NSLog(@"view1 frame: %@", NSStringFromCGRect(view1.frame));
NSLog(@"view1 center: %@", NSStringFromCGPoint(view1.center));
CGPoint originInWindowCoordinates = [self.window convertPoint:view1.bounds.origin fromView:view1];
NSLog(@"convertPoint:fromView: %@", NSStringFromCGPoint(originInWindowCoordinates));
CGPoint originInView1Coordinates = [self.window convertPoint:view1.frame.origin toView:view1];
NSLog(@"convertPoint:toView: %@", NSStringFromCGPoint(originInView1Coordinates));
Dans les deux cas, self.window est le récepteur. Mais il y a une différence. Dans le premier cas, le paramètre convertPoint est exprimé en coordonnées view1. Le résultat est le suivant:
convertPoint: fromView: {100, 100}
Dans le second, à la place, le convertPoint est exprimé en coordonnées superview (self.window). Le résultat est le suivant:
convertPoint: toView: {0, 0}
convertPoint
etconvertRect
diffèrent par le type de retour.CGPoint
ouCGRect
. Mais qu'en est-ilfrom
etto
? Y a-t-il une règle de base que je pourrais utiliser? Je vous remercie.Je trouve toujours cela déroutant, alors j'ai créé un terrain de jeu où vous pouvez explorer visuellement ce que fait la
convert
fonction. Cela se fait dans Swift 3 et Xcode 8.1b:N'oubliez pas d'afficher l'Assistant Editor ( ⎇⌘⏎) pour voir les vues, cela devrait ressembler à ceci:
N'hésitez pas à contribuer plus d'exemples ici ou dans cet essentiel .
la source
self.view
sont redondants, simples à utiliserview
s'ilsself
ne sont pas nécessaires.self
Voici une explication en anglais simple.
Lorsque vous souhaitez convertir le rect d'une sous-vue (
aView
est une sous-vue de[aView superview]
) en l'espace de coordonnées d'une autre vue (self
).la source
Chaque vue dans iOS a un système de coordonnées. Un système de coordonnées est comme un graphique, qui a un axe x (ligne horizontale) et un axe y (ligne verticale). Le point d'intersection des lignes est appelé origine. Un point est représenté par (x, y). Par exemple, (2, 1) signifie que le point est à 2 pixels à gauche et à 1 pixel en bas.
Vous pouvez en savoir plus sur les systèmes de coordonnées ici - http://en.wikipedia.org/wiki/Coordinate_system
Mais ce que vous devez savoir, c'est que, dans iOS, chaque vue a son propre système de coordonnées, dont le coin supérieur gauche est l'origine. L'axe X continue d'augmenter vers la droite et l'axe y continue d'augmenter vers le bas.
Pour la question de conversion des points, prenez cet exemple.
Il y a une vue, appelée V1, qui mesure 100 pixels de large et 100 pixels de haut. Maintenant à l'intérieur de cela, il y a une autre vue, appelée V2, à (10, 10, 50, 50) ce qui signifie que (10, 10) est le point dans le système de coordonnées de V1 où le coin supérieur gauche de V2 doit être situé, et ( 50, 50) est la largeur et la hauteur de V2. Maintenant, prenez un point à l'intérieur du système de coordonnées de V2, disons (20, 20). Maintenant, quel serait ce point à l'intérieur du système de coordonnées de V1? C'est à cela que servent les méthodes (bien sûr, vous pouvez vous calculer elles-mêmes, mais elles vous font gagner du travail supplémentaire). Pour mémoire, le point en V1 serait (30, 30).
J'espère que cela t'aides.
la source
Merci à tous d'avoir posté la question et vos réponses: cela m'a aidé à régler le problème.
Mon contrôleur de vue a sa vue normale.
À l'intérieur de cette vue, il existe un certain nombre de vues de regroupement qui ne font guère plus que de donner à leurs vues enfants une interaction claire avec les contraintes de mise en page automatique.
Dans l'une de ces vues de regroupement, j'ai un bouton Ajouter qui présente un contrôleur de vue popover où l'utilisateur entre des informations.
Pendant la rotation de l'appareil, le contrôleur de vue est alerté via l'appel UIPopoverViewControllerDelegate popoverController: willRepositionPopoverToRect: inView:
La partie essentielle qui vient de l'explication donnée par les deux premières réponses ci-dessus était que le droit dont j'avais besoin pour convertir était les limites du bouton d'ajout, pas son cadre.
Je n'ai pas essayé cela avec une hiérarchie de vues plus complexe, mais je soupçonne qu'en utilisant la vue fournie dans l'appel de méthode (inView :), nous contournons les complications de la laideur de la vue feuille à plusieurs niveaux.
la source
J'ai utilisé ce post pour postuler dans mon cas. J'espère que cela aidera un autre lecteur à l'avenir.
Une vue ne peut voir que ses enfants immédiats et ses vues parent. Il ne peut pas voir les vues de ses grands-parents ou de ses petits-enfants.
Donc, dans mon cas, j'ai une vue grand - parent appelé
self.view
, dans ce queself.view
j'ai ajouté subviews appeléself.child1OfView
,self.child2OfView
. Dansself.child1OfView
, j'ai ajouté subviews appeléself.child1OfView1
,self.child2OfView1
.Maintenant, si je me déplace physiquement
self.child1OfView1
vers une zone en dehors de la limite d'un autreself.child1OfView
endroitself.view
, puis pour calculer la nouvelle positionself.child1OfView1
duself.view:
la source
Vous pouvez voir le code ci-dessous pour comprendre comment cela fonctionne réellement.
la source
J'ai lu la réponse et je comprends la mécanique mais je pense que le dernier exemple n'est pas correct. Selon le document API, la propriété center d'une vue contient le point central connu de la vue dans le système de coordonnées de la vue supervisée.
Si tel est le cas, je pense que cela n'aurait pas de sens d'essayer de demander au superview de convertir le centre d'une sous-vue à partir du système de coordonnées de sous-vue car la valeur n'est pas dans le système de coordonnées de sous-vue. Ce qui aurait du sens, c'est de faire le contraire, c'est-à-dire de passer du système de coordonnées de superview à celui d'une sous-vue ...
Vous pouvez le faire de deux manières (les deux doivent donner la même valeur):
ou
Suis-je loin de comprendre comment cela devrait fonctionner?
la source
Un autre point important sur l'utilisation de ces API. Assurez-vous que la chaîne de vues parent est complète entre le recto que vous convertissez et la vue vers / depuis. Par exemple - aView, bView et cView -
Si nous essayons d'exécuter la méthode avant que bView n'ait été ajouté en tant que sous-vue de cView, nous obtiendrons une réponse de bunk. Malheureusement, il n'y a pas de protection intégrée dans les méthodes pour ce cas. Cela peut sembler évident, mais c'est quelque chose dont il faut être conscient dans les cas où la conversion passe par une longue chaîne de parents.
la source