2017-08-05 3 views
1

J'utilise Paintcode V3 et le dernier Xcode pour mon projet.Comment accéder à un calque dans la classe personnalisée UIView généré avec Paintcode?

Dans Paintcode, je dessine un chemin rouge, sorte de "aiguille d'horloge" avec une variable de rayon pour pouvoir le faire pivoter.

enter image description here

Dans mon projet Xcode, ce UIView personnalisé est ajouté à une vue principale.

Lorsque le chemin rouge est en rotation, j'ai besoin de savoir quand il croise un autre élément de la vue.

J'ai essayé:

if self.redPathView.frame.intersects(self.anotherView.frame) {  
    //do something...     
} 

mais il ne peut pas travailler parce redPathView est l'ensemble de la toile de Paintcode (le cadre carré) et non seulement le chemin rouge.

Je cherche un moyen d'accéder au chemin rouge de ma vue.

Répondre

0

Problème intéressant.

Je ne pense pas qu'il y ait un moyen de faire exactement ce que vous cherchez ...
Comme vous l'avez mentionné, lorsque nous utilisons PaintCode, nos dessins personnalisés deviennent un UIView entier.
Nous ne pouvons pas accéder à ses éléments spécifiques (comme votre redPathView).

(Je Favoriting cette question au cas où quelqu'un sait si nous pouvons réellement. Je peux me tromper.)

Quoi qu'il en soit, il y a une solution de contournement. Vous pourriez utiliser PaintCode lui-même pour vous dire quand des "collisions" se produisent. Bien sûr, alors vous auriez besoin de tout dessiner là-bas ... Et de mettre en place un contrôle interne qui aurait du sens pour vous. Par exemple, dans l'image ci-dessous j'ai créé cette "aiguille d'horloge", avec des fonctions pour détecter quand la chose rouge touche d'autres éléments d'interface utilisateur (point clé il y a l'expression touchedElementID - observez comment elle se met à jour avec le "ID "des rectangles):

paintCode

Il y a quelques problèmes que vous pouvez trouver avec cette approche, par exemple la nécessité de connaître la position exacte d'autres éléments sur l'écran et éventuellement des constructions ternaires complexes comme:

(rotationSanitized <= -352 || rotationSanitized >= -8) ? 
1 : 
(rotationSanitized <= -82 && rotationSanitized >= -98) ? 
2 : 
(rotationSanitized <= -172 && rotationSanitized >= -188) ? 
3 : 
(rotationSanitized <= -262 && rotationSanitized >= -278) ? 
4 : 0 

Aussi, comment "exporter" et consommer cette information avec le StyleKit dans Xcode?

Le truc que je l'ai fait était d'ajouter un vide (pas Fill, pas Stroke) élément d'interface utilisateur dans PaintCode et associer le résultat d'expression touchedElementID à la valeur alpha de l'élément.

De cette façon, j'ai pu accéder à l'expression dans ma vue personnalisée, par exemple via StyleKit.touchedElementID. Mais cela introduit un nouveau problème puisque maintenant je dois changer le StyleKit généré chaque fois qu'il est exporté (deux lignes de code, mais toujours). C'est une sorte de solution fragile.

Cependant, si vous êtes ok avec ça, alors il est juste une question de consommer ces nouvelles informations ...
Pour que j'ai créé un protocole, donc mon ViewController peut agir en tant que délégué de mon point de vue personnalisé et effectuer tout ce qu'il doit faire lorsque les éléments d'interface utilisateur les plus internes dans PaintCode sont "touchés".

Voici le résultat final:

iOS

Enfin, check this project in GitHub with all the code and samples.

+0

OK votre solution pourrait être fonctionne pour moi attendu sur un point "vous devez changer le StyleKit généré chaque fois qu'il est exporté". J'utilise PaintCode tout le temps, et je suis sûr que j'oublierai d'ajouter les 2 lignes ... Je vais essayer une autre solution, peut-être sans PaintCode. Merci – cmii

+0

Ouais, j'utilise beaucoup PaintCode aussi. Votre inquiétude est compréhensible. :-) –