2009-10-02 5 views
0

Je dois tracer un chemin le long de la forme d'une image de manière à ce qu'elle corresponde toujours à sa position sur l'image indépendamment de l'échelle de l'image. Pensez à cela comme la vue hybride de Google Maps où les noms de rues et les routes sont superposées sur les images aériennes.Superposition de chemins 2D sur UIImage sans mise à l'échelle des artefacts

En outre, cette trajectoire sera dessinée par les mouvements des doigts de l'utilisateur et je dois être en mesure de récupérer les points-clés du chemin sur les coordonnées des pixels de l'image. L'utilisateur effectue un zoom avant afin de définir plus précisément l'emplacement des chemins.

je parviens à en quelque sorte le faire fonctionner en utilisant cette approche:

-Créer un appelé UIView personnalisé CanvasView qui gère des touches d'interaction et offre mise à l'échelle, la rotation, les valeurs de traduction soit à la UIImageView ou PathsView (voir ci-dessous) en fonction un indicateur: deliverToImageOrPaths.

-Créez un UIImageView contenant l'image de base. Ceci est défini comme enfants de CanvasView

-Créez un UIView personnalisé appelé PathsView qui garde la trace de la géométrie des chemins 2D et se dessine avec un drawRect personnalisé. Ceci est défini en tant qu'enfants de UIImageView.

donc la hiérarchie: CanvasView -> UIImageView -> PathsView

De cette façon, quand deliverToImageOrPaths est OUI, les gestes des doigts transforme à la fois le UIImageView et son PathsView des enfants. Lorsque deliverToImageOrPaths est NON, les gestes n'affectent que PathsView en modifiant sa géométrie. Jusqu'ici tout va bien. Le problème que j'ai est que lors de la mise à l'échelle de la base UIImageView (via sa propriété .transform), le PathsView est mis à l'échelle avec des artefacts d'aliasing. drawRect est toujours appelé sur PathsView mais j'imagine qu'il exécute le dessin en utilisant la taille du tampon d'origine et en l'interpolant.

Comment puis-je résoudre ce problème? Existe-t-il de meilleurs moyens de mettre en œuvre ces fonctionnalités? PS: J'ai essayé de changer la classe de calque PathsView en CATiledLayer avec levelsOfDetailBias 4 et levelsOfDetail 4. Il résout le problème d'aliasing dans une certaine mesure, mais il est inacceptable lent à rendre.

Répondre

0

Si vous conservez les valeurs de tracé au fur et à mesure qu'elles sont dessinées, vous pouvez capturer le% de mise à l'échelle de l'image sous-jacente, puis repositionner les valeurs de tracé et les redessiner dans la méthode drawRect de PathsView. Cela impliquerait un peu de maths (principalement dans le sens des projections cartographiques) mais au lieu de redimensionner les bitmaps et d'obtenir des artefacts, vous seriez en train de redimensionner les points et de les redessiner en utilisant des vecteurs, ce qui le rendrait lisse à toute résolution. si vous connectez des points avec des beziers au lieu de pixels ou de lignes). Si vous tracez de la peinture le long des chemins à mesure que l'utilisateur les dessine et que vous jetez les données de points, la seule solution consiste à utiliser l'anti-aliasing bitmap, ce que fait essentiellement CATiledLayer pour vous et comme vous l'avez fait. découvert, peut être lent.

0

Si vous ciblez iPhone OS 3.0+, vous pouvez utiliser un CAShapeLayer pour votre chemin. Vous affectez un CGPathRef au calque et il gérera tout le dessin et la mise à l'échelle pour vous. Vous venez de définir la transformation du calque.

Questions connexes