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

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.

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)

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


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

proste i miłe!
nastassia
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.