2013-04-08 83 views
39

私はこのトピックに関する十五の質問を見てきました。多分、これは私を正しい道のりに戻す助けになるでしょう。convertPointを使用して親UIView内の相対位置を取得する

は、この設定を想像:

enter image description here

私はUIViewのにUIButtonの相対center座標を取得したいです。

つまり、UIButtonセンターはUITableViewCell内では215,80ですが、UIViewに対しては260,166のようにする必要があります。どのように2つの間で変換しますか?私はボタンのsuperviewsのすべてをループして、xとy座標を追加することによって、それを苦労して行うことができます

[[self.view superview] convertPoint:button.center fromView:button]; // fail 
[button convertPoint:button.center toView:self.view]; // fail 
[button convertPoint:button.center toView:nil]; // fail 
[button convertPoint:button.center toView:[[UIApplication sharedApplication] keyWindow]]; // fail 

が、私はそれはやり過ぎだ疑いがある:ここで

は、私が試したものです。私はcovertPoint設定の適切な組み合わせを見つける必要があります。右?

+0

それはあなたがあなたの質問に次の行を追加している場合に役立ちます。あなたのイメージ内のすべての4つのビューのフレームは、あなたがメソッドから得られる出力は、あなたが試してみましたが、その値ます実際に欲しい。 – rmaddy

答えて

86

button.centerそのスーパーの座標系内の指定された中心であるので、私はそれ以下の作品と仮定 :

CGPoint p = [button.superview convertPoint:button.center toView:self.view] 

それとも独自の座標系でのボタンの中央を計算し、それを使用します:

CGPoint buttonCenter = CGPointMake(button.bounds.origin.x + button.bounds.size.width/2, 
            button.bounds.origin.y + button.bounds.size.height/2); 
CGPoint p = [button convertPoint:buttonCenter toView:self.view]; 

スウィフト3

var p = button.convertPoint(button.center, to: self.view) 
+2

ビンゴ!あなたの最初の試みは、私が探していたものでした。スーパービューの座標系に結びついている中心は、私が欠けていたものです。ありがとうございました! – Axeva

+0

ありがとう@Martin R。これは役に立ちました –

+1

** Swift 3:** 'var buttonCenter = CGPoint(x:button.bounds.sign.width/2、y:button.bounds.origin.y + button.bounds .size.height/2) var p =ボタン。convertPoint(buttonCenter、to:self.view) ' –

10

マーティン回答は正しいです。使用して画面にスウィフトを使用する開発者のために、あなたがオブジェクトの位置を取得することができます(ボタン、ビュー、...)相対:SWIFT 2.2の

var p = obj.convertPoint(obj.center, toView: self.view) 

println(p.x) // this prints the x coordinate of 'obj' relative to the screen 
println(p.y) // this prints the y coordinate of 'obj' relative to the screen 
+0

@Axevaもっと正確な計算のための' convertRect'もあります[Here](http://stackoverflow.com/a/33879565/1634890) –

1

が私の仕事:

var OrignTxtNomeCliente:CGPoint! 

if let orign = TXT_NomeCliente.superview, let win = UIApplication.sharedApplication().keyWindow { 
     OrignTxtNomeCliente = orign.convertPoint(TXT_NomeCliente.frame.origin, toView: win) 
    } 
2

ここではSwift 3 @パブロの答えが更新されましたが、私の場合はうまくいきました。

if let window = UIApplication.shared.keyWindow { 
    parent.convert(child.frame.origin, to: window) 
} 
0

スウィフト4

あなたはボタンではなく、スーパーからconvertを呼び出す必要があります。私の場合は幅のデータが必要でしたので、中心点の代わりに範囲を変換しました。以下のコードは、私の作品:

let buttonAbsoluteFrame = button.convert(button.bounds, to: self.view) 
関連する問題