iPhone - Position von UIView im gesamten UIWindow abrufen

206

Die Position von a UIViewkann natürlich durch view.centeroder view.frameusw. bestimmt werden, aber dies gibt nur die Position von UIViewin Bezug auf seine unmittelbare Übersicht zurück.

Ich muss die Position des UIViewim gesamten 320x480-Koordinatensystem bestimmen. Wenn sich das UIViewbeispielsweise in einer UITableViewCellPosition innerhalb des Fensters befindet, kann sich dies unabhängig von der Übersicht dramatisch ändern.

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

Prost :)

Adam
quelle

Antworten:

339

Das ist ganz einfach:

[aView convertPoint:localPosition toView:nil];

... konvertiert einen Punkt im lokalen Koordinatenraum in Fensterkoordinaten. Mit dieser Methode können Sie den Ursprung einer Ansicht im Fensterbereich wie folgt berechnen:

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

2014 Edit: Angesichts der Popularität von Matt__Cs Kommentar erscheint es vernünftig, darauf hinzuweisen, dass die Koordinaten ...

  1. Nicht ändern, wenn das Gerät gedreht wird.
  2. haben ihren Ursprung immer in der oberen linken Ecke des nicht gedrehten Bildschirms.
  3. sind Fensterkoordinaten : Das Koordinatensystem wird durch die Grenzen des Fensters definiert. Die Koordinaten des Bildschirms und des Geräts unterscheiden sich und sollten nicht mit Fensterkoordinaten verwechselt werden.
Nikolai Ruhe
quelle
super :) Ich dachte, es sollte einfach sein, aber ich hatte das Gefühl, Apfel würde es nicht so einfach machen ... nun, sie haben es getan. danke
Lior Frenkel
41
Beachten Sie, dass Sie durch die Angabe von Null im Parameter toView Gerätekoordinaten erhalten, die nicht Ihren Wünschen entsprechen, wenn Sie sich nicht im Hochformat befinden. Siehe convertpointtoview-in-Querformat-Modus-Geben-Falsche-Werte
Matt__C
2
Diese Methode kehrte immer wieder aView.frame.originfür mich zurück. Ich brauchte eine ganze Weile, um zu erkennen, dass die Übersicht meiner Ansicht selbst keine Übersicht hatte.
Dan Abramov
3
Wenn Ihre SuperView keine SuperView hatte, sollte Ihre Ansicht überhaupt nicht gesehen werden
user4951
17
Wenn Sie die mit @Matt__C verknüpfte Lösung an Ihren Fall anpassen, wird dies zu:[view.superview convertPoint:view.frame.origin toView:[UIApplication sharedApplication].keyWindow.rootViewController.view]
Ghigo
49

Swift 5, Swift 4 :

let globalPoint = aView.superview?.convert(aView.frame.origin, to: nil)
Yuchen Zhong
quelle
33

Swift 3, mit 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)
    }
}
Mohsenasm
quelle
30

In Swift:

let globalPoint = aView.superview?.convertPoint(aView.frame.origin, toView: nil)
Shlomi Schwartz
quelle
9

Hier ist eine Kombination aus der Antwort von @Mohsenasm und einem Kommentar von @Chigo, der an Swift übergeben wurde

extension UIView {
    var globalFrame: CGRect? {
        let rootView = UIApplication.shared.keyWindow?.rootViewController?.view
        return self.superview?.convert(self.frame, to: rootView)
    }
}
Vlad Spreys
quelle
einfach und nett!
Nastassia