iPhone - Tüm UIWindow'da UIView Konumunu Al


206

A'nın konumu UIViewaçık bir şekilde view.centerveya view.framevb UIView. İle belirlenebilir, ancak bu sadece ani denetimine göre konumunu döndürür .

UIView320x480 koordinat sisteminin tamamının konumunu belirlemem gerekiyor . Örneğin , pencerenin içindeki UIViewbir UITableViewCellkonum, denetimden bağımsız olarak önemli ölçüde değişebilir.

Bunun mümkün olup olmadığı ve nasıl mümkün olduğu hakkında bir fikriniz var mı?

Şerefe :)

Yanıtlar:


340

Bu kolay bir soru:

[aView convertPoint:localPosition toView:nil];

... yerel koordinat alanındaki bir noktayı pencere koordinatlarına dönüştürür. Pencere alanında bir görünümün başlangıç ​​noktasını şu şekilde hesaplamak için bu yöntemi kullanabilirsiniz:

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

2014 Edit: Matt__C'nin yorumunun popülaritesine bakıldığında, koordinatların ...

  1. cihazı döndürürken değişmeyin.
  2. kökeni daima döndürülmemiş ekranın sol üst köşesinde olmalıdır.
  3. olan pencere koordinatları : pencerenin sınırları tarafından tanımlanan koordinat sistemi ist. Ekran ve cihaz koordinat sistemleri farklıdır ve pencere koordinatları ile karıştırılmamalıdır.

harika :) Basit olması gerektiğini düşündüm, ama elma bu kadar kolay vermeyeceğini hissettim ... iyi yaptılar. teşekkürler
Lior Frenkel

41
ToView parametresinde nil belirtmenin, cihaz koordinatları sağladığını unutmayın; bu, dikey yönde değilseniz istediğiniz şey olmayacaktır. Bkz. Manzara-modunda-mod-yanlış-değerleri
dönüştürmek bakış

2
Bu yöntem aView.frame.originbenim için dönmeye devam etti . Benim görüşümün denetiminin kendisinin bir denetiminin olmadığını fark ettim.
Dan Abramov

3
SuperView'iniz bir superView'a sahip değilse, görünümünüz hiç görülmemelidir
user4951

17
@Matt__C bağlantılı çözümü sizin durumunuza uyarlarsanız, şöyle olur:[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, dahili:

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

Swift'te:

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

9

İşte @Mohsenasm'ın cevabının ve @Chigo'nun Swift'e uyarladığı bir yorum

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

basit ve güzel!
nastassia
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.