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

adam
sumber

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.
Nikolai Ruhe
sumber
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)
Yuchen Zhong
sumber
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)
    }
}
Mohsenasme
sumber
30

Dalam Swift:

let globalPoint = aView.superview?.convertPoint(aView.frame.origin, toView: nil)
Shlomi Schwartz
sumber
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)
    }
}
Vlad Spreys
sumber
sederhana dan bagus!
nastassia