Получить позицию UIView в отношении супервизора
У меня есть UIView, в котором я организовал UIButtons. Я хочу найти позиции этих UIButtons.
Я знаю, что buttons.frame
предоставит мне свои позиции, но это даст мне позиции только в отношении его непосредственного наблюдения.
Есть ли способ найти позиции этих кнопок, с уважением к супервизору UIButtons?
Например, предположим, что существует UIView с именем "firstView" .
Затем у меня есть другой UIView, "secondView". Этот "SecondView" является подвид "firstView" .
Тогда у меня есть UIButton как subview на "secondView".
->UIViewController.view
--->FirstView A
------->SecondView B
------------>Button
Теперь, можно ли найти позицию этого UIButton относительно "firstView" ?
Ответы
Ответ 1
Вы можете использовать это:
Objective-C
CGRect frame = [firstView convertRect:buttons.frame fromView:secondView];
Swift
let frame = firstView.convert(buttons.frame, from:secondView)
Ссылка на документацию:
https://developer.apple.com/documentation/uikit/uiview/1622498-convert
Ответ 2
Хотя это и не относится к кнопке в иерархии, как было предложено, мне было проще это визуализировать и понять:
Отсюда: первоисточник
![enter image description here]()
ObjC:
CGPoint point = [subview1 convertPoint:subview2.frame.origin toView:viewController.view];
Swift:
let point = subview1.convert(subview2.frame.origin, to: viewControll.view)
Ответ 3
Обновлено для Swift 3
if let frame = yourViewName.superview?.convert(yourViewName.frame, to: nil) {
print(frame)
}
![enter image description here]()
Ответ 4
Кадр: (X, Y, ширина, высота).
Следовательно, ширина и высота не изменяются даже по супер-супер-представлению. Вы можете легко получить X, Y следующим образом.
X = button.frame.origin.x + [button superview].frame.origin.x;
Y = button.frame.origin.y + [button superview].frame.origin.y;
Ответ 5
Вы можете легко получить супер-супер вид следующим образом.
secondView → [кнопка суперпредставления]
firstView → [[superview кнопки] superview]
Затем вы можете получить положение кнопки..
Вы можете использовать это:
xPosition = [[button superview] superview].frame.origin.x;
yPosition = [[button superview] superview].frame.origin.y;
Ответ 6
Если есть несколько стеков, и вам не нужно (или не нужно) знать какие-либо возможные виды между интересующими вас представлениями, вы можете сделать это:
static func getConvertedPoint(_ targetView: UIView, baseView: UIView)->CGPoint{
var pnt = targetView.frame.origin
if nil == targetView.superview{
return pnt
}
var superView = targetView.superview
while superView != baseView{
pnt = superView!.convert(pnt, to: superView!.superview)
if nil == superView!.superview{
break
}else{
superView = superView!.superview
}
}
return superView!.convert(pnt, to: baseView)
}
где targetView
будет Button, baseView
будет ViewController.view
.
Эта функция пытается сделать следующее:
Если у targetView
нет суперпредставления, возвращается его текущая координата.
Если targetView's
не является baseView (т.е. между кнопкой и viewcontroller.view
есть другие представления), преобразованная координата извлекается и передается следующему superview
.
Он продолжает делать то же самое через стек представлений, движущихся в направлении baseView.
Как только он достигает baseView
, он выполняет одно последнее преобразование и возвращает его.
Примечание: он не обрабатывает ситуацию, когда targetView
располагается под baseView
.
Ответ 7
Расширение UIView для преобразования фрейма подпредставления (вдохновлено ответом @Rexb)
extension UIView {
// there can be other views between 'subview' and 'self'
func getConvertedFrame(fromSubview subview: UIView) -> CGRect? {
// check if 'subview' is a subview of self
guard subview.isDescendant(of: self) else {
return nil
}
var frame = subview.frame
if subview.superview == nil {
return frame
}
var superview = subview.superview
while superview != self {
frame = superview!.convert(frame, to: superview!.superview)
if superview!.superview == nil {
break
} else {
superview = superview!.superview
}
}
return superview!.convert(frame, to: self)
}
}
// usage:
let frame = firstView.getConvertedFrame(fromSubview: buttons.frame)