131 votes

Comprendre convertRect:toView:, convertRect:FromView:, convertPoint:toView: et convertPoint:fromView: méthodes

J'essaie de comprendre les fonctionnalités de ces méthodes. Pourriez-vous me fournir un simple cas d'utilisation pour comprendre leur sémantique?

À partir de la documentation, par exemple, convertPoint:fromView: méthode est décrite comme suit:

Convertit un point dans le système de coordonnées d'un point de vue à celui du récepteur.

Quel est le système de coordonnées veux dire? Ce qui sur le récepteur?

Par exemple, cela fait-il sens à l'aide de convertPoint:fromView: comme la suivante?

CGPoint p = [view1 convertPoint:view1.center fromView:view1];

À l'aide de NSLog utilitaire, j'ai vérifié que la valeur de p coïncide avec vue1 du centre.

Je vous remercie à l'avance.

EDIT: pour ceux que cela intéresse, 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, l'autonomie.la fenêtre est le récepteur. Mais il y a une différence. Dans le premier cas, la convertPoint paramètre est exprimé en vue1 coordonnées. Le résultat est le suivant:

convertPoint:fromView: {100, 100}

Dans la seconde, au lieu de cela, le convertPoint est exprimé dans superview (de soi.de la fenêtre) coordonnées. Le résultat est le suivant:

convertPoint:toView: {0, 0}

187voto

jrturton Points 64875

Chaque point de vue a son propre système de coordonnées avec une origine à 0,0 et une largeur et une hauteur. Ceci est décrit dans l' bounds rectangle de la vue. L' frame d'avis, cependant, ont pour origine le point dans les limites du rectangle de ses superview.

De l'extérieur vue de votre point de vue de la hiérarchie a son origine à 0,0, ce qui correspond à la partie supérieure gauche de l'écran sous iOS.

Si vous ajoutez un sous-vue à 20,30 de ce point de vue, puis un point à 0,0 dans la sous-vue correspond à un point à 20,30 dans le superview. Cette conversion est ce que ces méthodes sont en train de faire.

Votre exemple ci-dessus est inutile (pas de jeu de mots), car il convertit un point de vue à lui-même, de sorte que rien ne se passera. Vous n'auriez plus communément trouver d'où un certain point de vue par rapport à son superview - pour tester si un avis a été se déplacer hors de l'écran, par exemple:

CGPoint originInSuperview = [superview convertPoint:CGPointZero fromView:subview];

Le "récepteur" est une norme objective-c terme pour l'objet qui reçoit le message (méthodes sont également connus comme les messages) donc dans mon exemple ici, le récepteur est - superview.

30voto

horseshoe7 Points 707

Voici une explication en anglais. Vous pouvez utiliser ces fonctions lorsque vous voulez faire une sous-vue (aView) d'un point de vue ([aView superview]) la sous-vue d'un autre point de vue (auto), sans "bouger" sur l'écran.

// So here I want to take some subview and put it in my view's coordinate space
_originalFrame = [[aView superview] convertRect: aView.frame toView: self];

15voto

Chaque vue dans iOS ont un système de coordonnées. Un système de coordonnées est juste comme un graphe, qui a de l'axe x(ligne horizontale) et de l'axe y(ligne verticale). Le point où les lignes interesect est appelé origine. Un point est représenté par (x, y). Par exemple, (2, 1) signifie que le but est de 2 pixels à gauche, et de 1 pixel vers le bas.

Vous pouvez lire plus au sujet de systèmes de coordonnées ici - http://en.wikipedia.org/wiki/Coordinate_system

Mais ce que vous devez savoir, c'est que, dans l'iOS, chaque point de vue a son PROPRE système de coordonnées, où le coin supérieur gauche est l'origine. L'axe X va croissant vers la droite et de l'axe y va croissant vers le bas.

Pour la conversion des points en question, prenons un exemple.

Il est un point de vue, appelé V1, qui est de 100 pixels de large et 100 pixels de haut. Maintenant à l'intérieur, il y a un autre point de vue, appelé V2, (10, 10, 50, 50), ce qui signifie que (10, 10) est le point dans la V1 du système de coordonnées où le coin supérieur gauche de la V2 devrait être situé, et (50, 50) est la largeur et la hauteur de la V2. Maintenant, prendre un point à l'INTÉRIEUR de la V2 du système de coordonnées, dire (20, 20). Maintenant, quels seraient-ce point à l'intérieur de la V1 du système de coordonnées? C'est ce que les méthodes sont pour(bien sûr, vous pouvez calculer eux-mêmes, mais ils vous faire économiser de travail supplémentaire). Pour l'enregistrement, le point en V1 (30, 30).

Espérons que cette aide.

9voto

tobinjim Points 958

Merci à vous tous pour l'affichage de la question et vos réponses: Il m'a aidé à obtenir cette triés.

Mon point de vue, le contrôleur dispose d'un mode d'affichage normal.

À l'intérieur de ce point de vue il y a un certain nombre de groupement de points de vue qui ne peut guère faire plus que de donner à leur enfant vues propre interaction avec l'auto-contraintes de mise en forme.

À l'intérieur de l'un de ces regroupement de points de vue que j'ai un bouton Ajouter qui présente une fenêtre pop-over-vue-contrôleur où l'utilisateur entre des informations.

view
--groupingView
----addButton

Pendant dispositif de rotation de la vue-contrôleur est alerté par le UIPopoverViewControllerDelegate appel popoverController:willRepositionPopoverToRect:inView:

- (void)popoverController:(UIPopoverController *)popoverController willRepositionPopoverToRect:(inout CGRect *)rect inView:(inout UIView *__autoreleasing *)view
{
    *rect = [self.addButton convertRect:self.addbutton.bounds toView:*view];
}

La partie essentielle qui vient de l'explication donnée par les deux premières réponses ci-dessus a été que le rect j'avais besoin de convertir de a été les frontières du bouton ajouter, pas de cadre.

Je n'ai pas essayé cela avec un complexe de vue de la hiérarchie, mais je pense que par le biais de la vue fourni dans l'appel de méthode (inView:) nous contourner les complications de la multi-niveaux de feuilles de vue sortes de laideur.

1voto

Moonwalker Points 379

J'ai lu la réponse et de comprendre la mécanique, mais je pense que le dernier exemple n'est pas correct. Selon la doc API, le centre de la propriété d'un point de vue contient le sait point central de la vue dans la superview du système de coordonnées.

Si c'est le cas, que je pense qu'il n'aurait pas de sens d'essayer de demander à la superview à convertir le centre d'une sous-vue à PARTIR de la sous-vue du système de coordonnées, car la valeur n'est pas dans la sous-vue du système de coordonnées. Ce serait plus logique est de faire l'inverse c'est à dire de convertir les superview système de coordonnées à un sous-vue...

Vous pouvez le faire de deux manières, à la fois devrait donner la même valeur):

CGPoint centerInSubview = [subview convertPoint:subview.center fromView:subview.superview];

ou

CGPoint centerInSubview = [subview.superview convertPoint:subview.center toView:subview];

Suis-je loin dans la compréhension de la façon dont cela devrait fonctionner?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X