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


206

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

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

これが可能で、どのように可能かについてのアイデア

乾杯:)

回答:


340

それは簡単です。

[aView convertPoint:localPosition toView:nil];

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

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

2014編集: Matt__Cのコメントの人気を見て、座標が...

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

すごい:)私はそれは単純なはずだと思ったが、アップルがそれをそれほど簡単にできないと感じていた...まあ彼らはそうした。感謝
リオールフレンケル

41
toViewパラメータでnilを指定すると、デバイスの座標が得られることに注意してください。これは、縦向きではない場合は望みどおりの結果にはなりません。convertpointtoview-in-landscape-mode-giving-wrong-values
Matt__C

2
このメソッドはaView.frame.origin私に戻ってきました。私の見解のスーパービュー自体がスーパービューを持っていなかったことに気づくのに、私は驚きました。
Dan Abramov

3
あなたのスーパーは、あなたのビューが全く見られないはずスーパーを持っていなかった場合
user4951

17
@Matt__Cがあなたのケースを解決するリンク適応、それはなる:[view.superview convertPoint:view.frame.origin toView:[UIApplication sharedApplication].keyWindow.rootViewController.view]
Ghigo


33

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


9

@Mohsenasmの回答とSwiftに採用された@Chigoのコメントの組み合わせです

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

シンプルでいい!
nastassia
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.