У меня есть UIImageView
в self.view
(основной вид), а внутри него есть UIButton
. Я хочу знать, что кадр UIButton
в self.view
не в UIImageView
.
Как получить раму вида внутри другого вида?
Ответ 1
Я думаю, вы ищете этот метод
// Swift
let frame = imageView.convert(button.frame, to: self.view)
// Objective-C
CGRect frame = [imageView convertRect:button.frame toView:self.view];
Ответ 2
Существует четыре метода 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];
Ответ 3
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.
Ответ 4
Что-то вроде этого? может быть совершенно неправильным, dont действительно подумать, 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);
Я не знаю, есть ли более простой способ.