web-dev-qa-db-ja.com

iPhone-UIWindow全体でのUIViewの位置の取得

UIViewの位置は、明らかにview.centerまたはview.frameなどによって決定できますが、これは、即時のスーパービューに関連するUIViewの位置のみを返します。

320x480座標系全体でUIViewの位置を決定する必要があります。たとえば、UIViewUITableViewCellにある場合、ウィンドウ内の位置は、スーパービューに関係なく劇的に変化する可能性があります。

これが可能な場合、どのように考えますか?

乾杯:)

196
adam

それは簡単です:

[aView convertPoint:localPosition toView:nil];

...ローカル座標空間のポイントをウィンドウ座標に変換します。このメソッドを使用して、次のようにウィンドウ空間でビューのOriginを計算できます。

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

2014 Edit: Matt__Cのコメントの人気を見ると、座標が...

  1. デバイスを回転させても変更しないでください。
  2. 原点は常に回転していない画面の左上隅にあります。
  3. are ウィンドウ座標:座標系はウィンドウの境界によって定義されます。画面とデバイスの座標系は異なり、ウィンドウ座標と混同しないでください。
327
Nikolai Ruhe

Swift 4

let globalPoint = aView.superview?.convert(aView.frame.Origin, to: nil)
40
Yuchen Zhong

Swiftの場合:

let globalPoint = aView.superview?.convertPoint(aView.frame.Origin, toView: nil)
28
Shlomi Schwartz

Swift 3、拡張子付き:

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

@Mohsenasmによる回答と、Swiftに採用された@Chigoからのコメントの組み合わせを以下に示します。

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