Konvertieren eines CGPoint von einem UIView Koordinatensystem in ein Koordinatensystem CALayer

StackOverflow https://stackoverflow.com/questions/410278

Frage

Es Methoden sind eine CGPoint von einem UIView zum anderen zu übertragen und von einem CALayer zum anderen. Ich kann nicht einen Weg finden, eine CGPoint von einem UIView des Koordinatensystem in ein Koordinatensystem des CALayer zu ändern.

Ist eine Schicht und Host-Ansicht der es die gleiche Koordinatensystem? Benötige ich Punkte zwischen ihnen zu verwandeln?

Danke, Corey

[EDIT]

Danke für die Antwort! Es ist schwer, Informationen über die Unterschiede / Ähnlichkeiten zwischen CA auf dem iPhone und Mac zu finden. Ich bin überrascht, dass ich nicht dieses Problem finden konnte, direkt in jeder Apple-Dokumentation gerichtet.

Ich verfolge diese Antwort mit einem Fehler zu helfen, ich bin zur Fehlerbehebung, und dies war bisher meine beste Vermutung, aber ich glaube, ich bin auf den Holzweg auf. Wenn die Koordinatensysteme gleich sind, dann habe ich ein anderes Problem ...

Die aktuelle Ausgabe kann ich habe hier auf Stack-Überlauf zu finden: Treffer Schicht Test nur Rückkehr Schicht, wenn untere Hälfte der Schicht berührt

War es hilfreich?

Lösung

Sie können die transform Eigenschaft CALayers auf die entsprechende Transformation gesetzt, wenn Sie ihr Koordinatensystem drehen wollen, aber beachten Sie, dass dies wahrscheinlich ihre Zeichnung des contents Flip wird auch (ich habe nicht getestet, aber es macht Sinn, dass dies wäre wahr). Meine Behauptung, dass die CALayer mit einer UIView zugehörigen Aktien das gleiche System in der Tat koordinieren könnte völlig falsch sein. Es könnte auch sein, dass CALayers das gleiche System wie UIViews koordinieren verwenden (das heißt, sie sind nie vertikal gespiegelt), aber ich dachte, dass sie seit dem Core Graphics waren verwendet ein Koordinatensystem relativ zu UIKit gekippt.

Ein einfacher Weg, um eine Bildschirm-Größe CALayer als Unterschicht aus einer Ansicht der Schicht, dann fügen Sie eine weitere kleine CALayer als Unterschicht hinzufügen, dass wäre zu testen. Man könnte es eingestellt auf (0, 0, 320, 100), um zu zeigen, und sehen, ob es auf der Oberseite zeigt nach oben oder unten auf den Bildschirm des iPhone. Dies wird Ihnen sagen, in welche Richtung die Y-Achse für Coreanimation geht.

- (void)viewDidLoad {
  [super viewDidLoad];
  CALayer *rootLayer = [CALayer layer];
  rootLayer.frame = self.view.layer.bounds;
  CALayer *smallLayer = [CALayer layer];
  smallLayer.frame = CGRectMake(0, 0, rootLayer.bounds.size.width, 50);
  smallLayer.backgroundColor = [UIColor blueColor].CGColor;
  [rootLayer addSublayer:smallLayer];
  [self.view.layer addSublayer:rootLayer];
}

Ich habe gerade diesen Test selbst durchgeführt, und es scheint, CALayers tatsächlich nutzt das gleiche Koordinatensystem wie UIViews, so meine Behauptung, dass CALayer Flip die Y-Achse definitiv falsch ist. Wenn Sie jedoch mit Core Graphics direkt tun Zeichnung, beachten Sie, dass Core Graphics nicht eine umgekehrte Y-Achse verwenden (obwohl, wenn sie in einer UIView Unterklasse Zeichnung oder gehe ich davon aus, einen CALayer Delegierten, der Kontext Core Graphics wird bereits blätterte die UIView (oder CALayer des) Koordinatensystem).

übereinstimmen

So die kurze Antwort, wenn Sie es bis hierher geschafft, ist das Koordinatensystem für CALayer sollte das Koordinatensystem für die entsprechenden UIView entsprechen.

Andere Tipps

Die Dokumentation für hitTest sagt:

/* Returns the farthest descendant of the layer containing point 'p'.
 * Siblings are searched in top-to-bottom order. 'p' is in the
 * coordinate system of the receiver's superlayer. */

So was Sie tun müssen (so etwas wie diese):

CGPoint thePoint = [touch locationInView:self];
thePoint = [self.layer convertPoint:thePoint toLayer:self.layer.superlayer];
CALayer *theLayer = [self.layer hitTest:thePoint];

In Bezug auf die Apple-Dokumentation, fand ich ein "iPhone OS Note" in der Ebenenkoordinatensystem Abschnitt der Core Animation Programming Guide (2008-11-13).

  

das Root- Schicht eines UIView Beispiel verwendet ein Koordinatensystem umgedreht, dass das Standardsystem einer instanz des UIView Koordinateneinstimmt Ursprungs ist in dem oberen linken und Wert erhöht nach unten und nach rechts. Schichten erstellt von CALayer direkt verwenden, um die Standard-Core Animation Koordinatensystem instanziieren.

Aus meinen Tests habe ich herausgefunden, dass Unterschichten das gleiche Koordinatensystem teilen, wie es übergeordnete Ebene ist und daher, wenn Sie Unterschicht auf eine UIView Schicht hinzugefügt werden, dann werden sie das gleiche Koordinatensystem teilen.

Falls Sie noch das Koordinatensystem kippen wollen, so dass es Ursprung ist, ist in der oberen linken Ecke sollten Sie diese Transformation verwenden, die die y-Achse dreht. (X, y, 1) = (x 'y', 1) * [1 0 0], [0 -1 0], [0 heigth 1]

, die mit Code übersetzt ist: [Your_layer setAffineTransform: CGAffineTransformMake (1,0,0, -1,0, heigth)];

Ich glaube, dass das Koordinatensystem eines UIView und die damit verbundenen Schicht soll gleich sein. Wenn Sie jedoch Schichten selbst erstellen, das Koordinatensystem vertikal gespiegelt.

Methods that fixing frames and points
- (CGRect) fixRect:(CGRect)rect inRect:(CGRect)container
{
    CGRect frame = rect;
    frame.origin.y = container.size.height - frame.origin.y - frame.size.height;
    return frame;
}
- (CGPoint) fixPoint:(CGPoint)point fromPoint:(CGSize)containerSize
{
    CGPoint frame = point;
    frame.y = size.height - frame.y;
    return frame;
}

Ich glaube, dass die beide das gleiche Koordinatensystem haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top