2017-03-08 1 views
0

Je travaille sur la création d'un moyen pour un utilisateur de déplacer des polygones à l'écran et changer leur forme en faisant glisser leurs sommets de coin. Je dois ensuite être capable de redessiner ces polygones modifiés sur d'autres appareils - je dois donc pouvoir obtenir les positions finales de tous les sommets pour tous les polygones à l'écran.Est-il possible d'obtenir des points de contrôle de courant UIBezierPath après la transformation du chemin?

C'est ce que je fais actuellement:

Je dessine des polygones à l'aide UIBezierPath pour chaque forme de la substitution de la fonction drawRect. Je permets ensuite à l'utilisateur de les faire glisser autour de l'écran en appliquant la fonction CGAffineTransformMakeTranslation et les deltas de coordonnées et y en touchedMoved. J'ai les points de contrôle initiaux à partir desquels les polygones initiaux sont dessinés (comme décrit here). Mais une fois qu'une instance de chemin est déplacée sur l'écran, ces valeurs ne changent pas - ainsi je suis seulement capable d'obtenir des valeurs initiales.

Y a-t-il quelque chose dans la structure Core Graphics qui va me permettre de saisir un ensemble de points de contrôle en cours dans une instance UIBezierPath? J'essaie d'éviter de garder une trace de ces points manuellement. Je vais envisager d'utiliser d'autres moyens de tirer si:

  • Il est construit - de manière à détecter si un point se trouve dans ce polygone (comme UIBezierPath#contains méthode
  • Une façon d'introduire facilement des contraintes si l'utilisateur peut » t déplacer un polygone hors des limites de la superview (j'ai besoin du polygone entier pour être visible)
  • une façon de saisir tous les points facilement lorsque l'utilisateur se fait
  • tout peut fonctionner sous 60fps sur iPhone 5.

Merci pour votre temps!

Répondre

1

Étant donné que vous appliquez la transformation à la vue/couche, pour obtenir les points de contrôle transformés à partir du chemin, appliquez simplement cette même transformation au chemin, puis récupérez les points de contrôle. Quelque chose comme:

UIBezierPath* copiedPath = [myPath copy]; 
[copiedPath applyTransform:[view transform]]; 
[self yourExistingMethodToFetchPointsFromPath:copiedPath]; 

La façon dont vous êtes en train de tirer les points d'un chemin est malheureusement à la seule API disponible pour les points de re-extraction à partir d'un UIBezierPath d'entrée. Cependant - vous pourriez être intéressé par une bibliothèque que j'ai écrite pour rendre le travail avec le chemin de Bézier beaucoup plus simple: PerformanceBezier. Cette bibliothèque rend beaucoup plus facile d'obtenir des points d'un chemin:

for(NSInteger i=0;i<[path elementCount];i++){ 
    CGPathElement element = [path elementAtIndex:n]; 
    // now you know the element.type and the element.points 
} 

En plus d'ajouter des fonctionnalités pour rendre les chemins plus faciles à travailler avec, il ajoute également une couche de mise en cache au-dessus de l'API existante pour rendre la performance coup de travailler avec des chemins beaucoup beaucoup plus petits. Selon la quantité de temps processeur que vous dépensez sur les méthodes UIBezierPath, cette bibliothèque va apporter une amélioration significative. J'ai vu between 2x and 10x improvement, selon les opérations que j'utilisais.