2009-10-16 3 views
1

Encore un démarreur de dev iphone mais essayant.Accrochez-vous à l'effet de grille avec Quartz 2d? iphone dev

Je souhaite que l'utilisateur touche l'écran à quel point une broche (point) sera placée sur la vue.

Je l'ai accompli (yey) mais je voudrais avoir un effet de prise en main et ne peux pas trouver de solution. Voici comment je place ce point:

CGPoint = CGPointMake points de soutirage (lastTouch.x - HorizontalOffset, lastTouch.y -> VerticalOffset); [drawImage drawAtPoint: drawPoint]; // Dites l'image de se dessiner

J'ai une grille en arrière-plan sur un viewController, qui se chevauchent cette grille j'ai un UIView avec dessin personnalisé qui affiche une épingle à chaque fois que l'utilisateur touche l'écran.

(et pour quelque raison que le point apparaît déjà avant que l'utilisateur touche ... tout bien que ce soit une autre requête que je suis à la recherche dans le moment)

donc à l'effet logiciel enfichable de grille. Des idées?

Répondre

5

En supposant que votre approche consiste à laisser l'utilisateur taper, puis de placer la goupille à l'intersection de la grille la plus proche, il s'agit simplement d'un problème d'arrondi.

// assume these constants 
// kVGridOffset, kHGridOffset: the difference between the origin of the view 
// and the origin of the grid 
// kVGridSpacing, kHGridSpacing: the size of the grid itself 

// set initial coordinates from touch 
CGPoint drawPoint = CGPointMake(lastTouch.x - horizontalOffset, lastTouch.y - verticalOffset); 

// remove the offset, round to nearest increment of spacing, and return offset 
drawPoint.x = floor((drawPoint.x - kHGridOffset)/kHGridSpacing + 0.5) * kHGridSpacing + kHGridOffset; 
drawPoint.y = floor((drawPoint.y - kVGridOffset)/kVGridSpacing + 0.5) * kVGridSpacing + kVGridOffset; 

// draw the image 
[drawImage drawAtPoint:drawPoint]; 

EDIT: avec la disponibilité de nearbyint() pour l'arrondissement, les choses peuvent être un peu plus propre:

drawPoint.x = nearbyint((drawPoint.x - kHGridOffset)/kHGridSpacing) * kHGridSpacing + kHGridOffset; 
drawPoint.y = nearbyint((drawPoint.y - kVGridOffset)/kVGridSpacing) * kVGridSpacing + kVGridOffset; 
+0

Ceci est une meilleure solution que la mienne;) – Jasarien

+0

Comment calculez-vous le gridOffSet? Si les deux vues sont superposées, la taille ne serait-elle pas la même? @ sixten-otto – JasonBourne

+0

Ils pourraient, et les compensations pourraient bien être nulles. Mais si l'origine de la grille n'est pas exactement à l'origine de la superposition, ces constantes expliqueraient la différence. Les valeurs exactes dépendraient des spécificités de votre application. –

1

Vous aurez besoin d'une sorte de structure de données qui représente la grille dans votre contrôleur de vue. Peut-être qu'il contiendra un tableau de coordonnées, chacune représentant où les lignes verticales et horizontales se croisent.

Ensuite, lorsque vous touchez la vue, vous comparez la valeur y avec toutes les valeurs y de votre structure de grille et choisissez celle qui est la plus proche. Idem pour la valeur x. Cela devrait donner l'idée d'un clin d'œil à la grille.

+0

L'idée que je tapais à propos était d'arrondir la valeur de x tactile et les coordonnées y au plus proche 5, cela pourrait-il aussi produire l'effet désiré? –

+1

Cela dépend de la logique de votre arrondi. Beaucoup de gens oublient que lorsque vous lancez un float vers un int, arrondi ne se produit pas - la valeur est tronquée, 12.6 deviendra 12. Vous pouvez utiliser nearestint() (déclaré dans math.h) pour arrondir vos nombres. – Jasarien

+0

nearbyint() rendrait également ma solution plus propre (montre combien de programmation C j'ai fait ces derniers temps ... Je n'avais aucune idée de l'existence!) –

Questions connexes