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 :)

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.

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)

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)
    }
}

30

In Swift:

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

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)
    }
}

einfach und nett!
Nastassia
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.