wake-up-neo.com

iPhone - Position von UIView im gesamten UIWindow ermitteln

Die Position eines UIView kann offensichtlich durch view.center oder view.frame usw., aber dies gibt nur die Position des UIView in Bezug auf seine unmittelbare Übersicht zurück.

Ich muss die Position des UIView im gesamten 320x480-Koordinatensystem bestimmen. Wenn sich das UIView beispielsweise in einem UITableViewCell befindet, kann sich seine Position innerhalb des Fensters ungeachtet der Übersicht dramatisch ändern.

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

Prost :)

196
adam

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 folgenden Fensterbereich 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. der Ursprung befindet sich immer in der oberen linken Ecke des nicht gedrehten Bildschirms.
  3. are Fensterkoordinaten: Das Koordinatensystem wird durch die Grenzen des Fensters definiert. Die Bildschirm- und Gerätekoordinatensysteme sind unterschiedlich und sollten nicht mit Fensterkoordinaten verwechselt werden.
327
Nikolai Ruhe

Swift 4:

let globalPoint = aView.superview?.convert(aView.frame.Origin, to: nil)
40
Yuchen Zhong

In Swift:

let globalPoint = aView.superview?.convertPoint(aView.frame.Origin, toView: nil)
28
Shlomi Schwartz

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

Hier ist eine Kombination aus der Antwort von @Mohsenasm und einem Kommentar von @Chigo, der für Swift übernommen wurde

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