2012-03-25 10 views
1

Ich habe ein Bild, das vom Benutzer gedreht und skaliert werden darf. Jedes Mal, wenn der Benutzer auf das Bild klickt, versuche ich herauszufinden, ob der Punkt transparent ist oder nicht.iphone - CGAffineTransformRotate auf Punkt in Hittest anwenden

Wenn es transparent ist, gebe ich null im HitTest meiner Ansicht zurück, wenn es nicht transparent ist, gebe ich die Ansicht zurück. Probleme treten auf, wenn der Benutzer das Bild dreht. In meiner hitTest-Methode muss ich den Punkt entsprechend der Rotation der aktuellen Ansicht transformieren. Andernfalls zeigt der Punkt einen irrelevanten Ort auf der Ansicht (und dem Bild) an.

Wie mache ich das?

Vielen Dank.

Antwort

2

Diese CGAffineTransform Reference helfen könnten:

CGPointApplyAffineTransform 

CGRectApplyAffineTransform 

und

CGSizeApplyAffineTransform 

Aber bevor Sie anfangen zu denken, dass Sie die Zuordnung von Hand ausführen müssen, würde ich vorschlagen, es zu versuchen ‚, als ob 'Die aktuelle Transformation war CGAffineIdentity und codieren Sie Ihre Koordinatenerkennung entsprechend. Sie könnten von den Ergebnissen überrascht sein ...

Meine eigene Erfahrung sagt, dass es aussieht, wenn Sie Ihre Punkte von UITouch locationIn_SomeView_ bekommen die invertierte Matrix von SomeView auf den Punkt angewendet wird, bevor es an Sie zurück übergeben wird.

Sie benötigen also wahrscheinlich keine der CGxxxApplyAffineTransform, außer Sie generieren die Punkte selbst, außerhalb des Ereignissystems.

+0

Großartig, danke! Tatsächlich wurde mir das Koordinatensystem des uiviews eine Chance gegeben. Aber da ich die Farbe eines bestimmten Pixels im Bild überprüfe, scheint es, dass es nicht genug ist. – vondip

+1

In meinem Fall ist es. Ich habe ein nicht rechteckiges Bild (abgerundetes Dreieck) mit vollständig transparenten Pixeln überall, aber innerhalb des Dreiecks. Und ich wollte, dass meine Berührungserkennung nicht auf den "transparenten" Pixeln auslöst. Also habe ich getan, was Sie sagen, dh: Ich bekomme an der Pixel-Koordinate des Bildes *, deren rechteckige Grenzen * mit den View-Grenzen ausgerichtet ist. Wenn wir den "Retina-Skalierungsfaktor" für eine Minute ignorieren, wird jeder Punkt innerhalb der Ansichtsgrenzen direkt auf ein Pixel im Bild abgebildet. SELBST WENN DER BLICK WÄHREND IST – verec

+0

Eigentlich hast du recht! Ich habe es einfach versucht. Du sagst, dass es vielleicht nicht im Rattenmodus funktioniert? – vondip

Verwandte Themen