Как получить кадр вида внутри другого вида? - PullRequest
37 голосов
/ 10 ноября 2011

У меня есть UIImageView в self.view (основной вид) и внутри него есть UIButton. Я хочу знать, что такое кадр UIButton в self.view, а не в UIImageView.

Ответы [ 4 ]

91 голосов
/ 10 ноября 2011

Я думаю, вы ищете этот метод

- convertRect: toView:

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

// Objective-C
CGRect frame = [imageView convertRect:button.frame toView:self.view];
20 голосов
/ 10 ноября 2011

Существует четыре метода UIView, которые могут вам помочь, преобразовывая CGPoints и CGRects из одной 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];
8 голосов
/ 07 марта 2017

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

Вы можете просто ссылаться на myButton.superview вместо myImageView при преобразовании кадра.


Вот еще несколько вариантов преобразования 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 .
2 голосов
/ 10 ноября 2011

Как то так?может быть, это неправильно, Динт действительно продумал это; 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);

Я не знаю, есть ли более простой способ.

...