2009-09-23 4 views
176

Die Position eines UIView kann offensichtlich durch view.center oder view.frame usw. bestimmt werden, aber dies gibt nur die Position des UIView in Bezug auf das unmittelbare Superview ist.iPhone - Get Position von UIView innerhalb gesamten UIWindow

Ich muss die Position der UIView im gesamten 320x480 Koordinatensystem bestimmen. Zum Beispiel, wenn der UIView in einem UITableViewCell ist, kann seine Position innerhalb des Fensters sich ohne Rücksicht auf den Superview dramatisch ändern.

Irgendwelche Ideen, ob und wie das möglich ist?

Prost :)

Antwort

300

Das ist ein einfacher:

[aView convertPoint:localPosition toView:nil]; 

... wandelt ein Punkt im lokalen Koordinatenraum zu Fensterkoordinaten. Sie können diese Methode verwenden, um eine Ansicht der Ursprung im Fensterraum wie folgt zu berechnen:

[aView.superview convertPoint:aView.frame.origin toView:nil]; 

2014 Edit: Mit Blick auf die Popularität von Matt__C Kommentar es sinnvoll scheint, dass die Koordinaten, darauf hinzuweisen ...

  1. nicht ändern, wenn das Gerät gedreht wird.
  2. haben immer ihren Ursprung in der oberen linken Ecke des nicht gedrehten Bildschirms.
  3. sind Fensterkoordinaten: Das Koordinatensystem ist durch die Grenzen des Fensters definiert. Die Bildschirm- und Gerätekoordinatensysteme sind unterschiedlich und sollten nicht mit Fensterkoordinaten verwechselt werden.
+0

genial :) Ich dachte, es sollte einfach sein, aber ich hatte das Gefühl, dass Apple es nicht so einfach geben würde ... nun, sie taten es. danke –

+0

Ich fügte eine andere Frage hinzu - es funktionierte für mich im Simulator, aber nicht auf dem realen Gerät :( –

+0

hier ist die andere Frage http://Stackoverflow.com/q/6013766/531527 –

22

In Swift:

let globalPoint = aView.superview?.convertPoint(aView.frame.origin, toView: nil) 
19

Swift 4:

let globalPoint = aView.superview?.convert(aView.frame.origin, to: nil) 
8

Swift 3, mit der Erweiterung:

extension UIView{ 
    var globalPoint :CGPoint? { 
     return self.superview?.convert(self.frame.origin, to: nil) 
    } 

    var globalFrame :CGRect? { 
     return self.superview?.convert(self.frame, to: nil) 
    } 
}