iPhone - Dapatkan Posisi UIView di seluruh UIWindow


206

Posisi a UIViewdapat dengan jelas ditentukan oleh view.centeratau view.framedll. Tetapi ini hanya mengembalikan posisi UIViewsehubungan dengan superview langsungnya.

Saya perlu menentukan posisi UIViewdi seluruh sistem koordinat 320x480. Misalnya, jika UIViewberada dalam UITableViewCellposisi di dalam jendela dapat berubah secara dramatis terlepas dari superview.

Adakah ide jika dan bagaimana ini mungkin?

Bersulang :)

Jawaban:


340

Itu yang mudah:

[aView convertPoint:localPosition toView:nil];

... mengonversi titik di ruang koordinat lokal ke koordinat jendela. Anda dapat menggunakan metode ini untuk menghitung asal tampilan dalam ruang jendela seperti ini:

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

Sunting 2014: Melihat popularitas komentar Matt__C tampaknya masuk akal untuk menunjukkan bahwa koordinat ...

  1. jangan berubah saat memutar perangkat.
  2. selalu memiliki asal mereka di sudut kiri atas layar yang tidak diputar.
  3. adalah koordinat jendela : Sistem koordinat ditentukan oleh batas-batas jendela. Sistem koordinat layar dan perangkat berbeda dan tidak boleh dicampuradukkan dengan koordinat jendela.

luar biasa :) Saya pikir itu harus sederhana, tetapi saya merasa apel tidak akan memberikannya begitu mudah ... well mereka melakukannya. terima kasih
Lior Frenkel

41
Ketahuilah bahwa menentukan nihil dalam parameter toView memberi Anda koordinat perangkat, yang tidak akan sesuai dengan yang Anda inginkan jika Anda tidak dalam orientasi potret. Lihat convertpointtoview-in-landscape-mode-giving-salah-nilai
Matt__C

2
Metode ini terus kembali aView.frame.originuntuk saya. Butuh waktu bagi saya untuk menyadari bahwa pandangan saya tidak memiliki pandangan itu sendiri.
Dan Abramov

3
Jika superView Anda tidak memiliki superView tampilan Anda seharusnya tidak terlihat sama sekali
user4951

17
Mengadaptasi solusi yang terkait @Matt__C untuk kasus Anda, itu akan menjadi:[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, dengan ekstensi:

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

Dalam Swift:

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

9

Berikut adalah kombinasi dari jawaban oleh @Mohsenasm dan komentar dari @Chigo yang diadopsi ke Swift

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

sederhana dan bagus!
nastassia
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.