web-dev-qa-db-ja.com

別のビュー内にビューのフレームを取得する方法は?

self.view(メインビュー)にUIImageViewがあり、その中にUIButtonがあります。 UIButtonにないself.viewUIImageViewのフレームを知りたい。

37
CrazyDev

この方法を探していると思います

– convertRect:toView:

// Swift
let frame = imageView.convert(button.frame, to: self.view)

// Objective-C
CGRect frame = [imageView convertRect:button.frame toView:self.view];
91
beryllium

UIViewCGPointsをあるCGRects座標参照から別の座標参照に変換するのに役立つ4つのUIViewメソッドがあります。

– convertPoint:toView:
– convertPoint:fromView:
– convertRect:toView:
– convertRect:fromView:

だからあなたは試すことができます

CGRect f = [imageView convertRect:button.frame toView:self.view];

または

CGRect f = [self.view convertRect:button.frame fromView:imageView];
20
jbat100

Swift 3

これにより、ボタンのフレームをビューの座標系に変換できます。

self.view.convert(myButton.frame, from: myButton.superview)


ロジックはviewDidLayoutSubviewsではなくviewDidLoad内に配置してください。ジオメトリ関連の操作は、サブビューをレイアウトした後に実行する必要があります。そうしないと、サブビューが正しく機能しない場合があります。

class ViewController: UIViewController {

    @IBOutlet weak var myImageView: UIImageView!
    @IBOutlet weak var myButton: UIButton!

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        let buttonFrame = self.view.convert(myButton.frame, from: myButton.superview)
    }
}

フレームを変換するときに、myImageViewの代わりにmyButton.superviewを参照するだけです。


CGPointまたはCGRectを変換するためのその他のオプションがあります。

self.view.convert(point: CGPoint, from: UICoordinateSpace)
self.view.convert(point: CGPoint, from: UIView)             
self.view.convert(rect: CGRect, from: UICoordinateSpace)
self.view.convert(rect: CGRect, from: UIView)

self.view.convert(point: CGPoint, to: UICoordinateSpace)
self.view.convert(point: CGPoint, to: UIView)
self.view.convert(rect: CGRect, to: UICoordinateSpace)
self.view.convert(rect: CGRect, to: UIView)

CGPointまたはCGRectの変換の詳細については、 Apple Developer Docs を参照してください。

8
Derek Soike

このようなもの?まったく間違っているかもしれませんが、dintは本当に考えました; p

CGRect frame = CGRectMake((self.view.frame.Origin.x-imageview.frame.Origin.x) +btn.frame.Origin.x,
                          (self.view.frame.Origin.y.imageview.frame.Origin.y)+btn.frame.Origin.y,
                          btn.frame.size.width,
                          btn.frame.size.height);

もっと簡単な方法があるかどうかはわかりません。

1
Rasmus Styrk