iPhone - Uzyskaj pozycję UIView w całym UIWindow

206

Pozycję UIViewmożna oczywiście określić view.centerczy view.frameitd. Ale to tylko zwraca pozycję UIVieww stosunku do jego natychmiastowego SuperView.

Muszę określić pozycję UIVieww całym układzie współrzędnych 320 x 480. Na przykład, jeżeli UIViewznajduje się w UITableViewCellpołożeniu Jest w oknie może zmienić radykalnie irregardless z SuperView.

Wszelkie pomysły, czy i jak to możliwe?

Twoje zdrowie :)

Adam
źródło

Odpowiedzi:

340

To łatwe:

[aView convertPoint:localPosition toView:nil];

... konwertuje punkt w lokalnej przestrzeni współrzędnych na współrzędne okna. Możesz użyć tej metody do obliczenia początku widoku w przestrzeni okna w następujący sposób:

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

Edycja 2014: Patrząc na popularność komentarza Matt__C, rozsądne wydaje się wskazanie, że współrzędne ...

  1. nie zmieniaj podczas obracania urządzenia.
  2. zawsze mają swój początek w lewym górnym rogu niezabezpieczonego ekranu.
  3. współrzędnymi okna : układ współrzędnych jest zdefiniowany przez granice okna. Układy współrzędnych ekranu i urządzenia są różne i nie należy ich mylić ze współrzędnymi okna.
Nikolai Ruhe
źródło
super :) Myślałem, że to powinno być proste, ale miałem wrażenie, że jabłko nie sprawi, że będzie tak łatwo ... no cóż. dzięki
Lior Frenkel
41
Należy pamiętać, że określenie wartości zero w parametrze toView daje współrzędne urządzenia, które nie będą takie, jak chcesz, jeśli nie jesteś w orientacji pionowej. Zobacz convertpointtoview-in-landscape-mode-podając-nieprawidłowe-wartości
Matt__C
2
Ta metoda wciąż aView.frame.origindo mnie wracała . Chwilę zajęło mi uświadomienie sobie, że superwizja mojego poglądu sama nie miała superwizji.
Dan Abramov,
3
Jeśli twój superView nie miał superView, twój widok nie powinien być w ogóle
widoczny
17
Dostosowując powiązane rozwiązanie @Matt__C do twojej sprawy, byłoby to:[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
źródło
33

Swift 3, z rozszerzeniem:

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
źródło
30

W Swift:

let globalPoint = aView.superview?.convertPoint(aView.frame.origin, toView: nil)
Shlomi Schwartz
źródło
9

Oto połączenie odpowiedzi @Mohsenasm i komentarza @Chigo przyjętego do Swift

extension UIView {
    var globalFrame: CGRect? {
        let rootView = UIApplication.shared.keyWindow?.rootViewController?.view
        return self.superview?.convert(self.frame, to: rootView)
    }
}
Vlad Spreys
źródło
proste i miłe!
nastassia