it-swarm.com.ru

Получить позицию UIView относительно суперпредставления своего суперпредставления

У меня есть UIView, в котором я расположил кнопки UIB. Я хочу найти позиции этих кнопок UIB. 

Я знаю, что buttons.frame даст мне позиции, но он даст мне позиции только в отношении своего непосредственного супервизора. 

Есть ли какой-нибудь способ, которым мы можем найти положения этих кнопок, с уважением к суперпредставлению UIButtons? 

Например, предположим, что есть UIView с именем «firstView».

Затем у меня есть еще один UIView, "secondView". Этот «Второй вид» является подпредставлением «Первый вид». 

Тогда у меня UIButton в качестве подпредставления на "secondView". 

->UIViewController.view
--->FirstView A
------->SecondView B
------------>Button

Теперь, есть ли какой-нибудь способ, которым мы можем найти положение этого UIButton, относительно «firstView»?

65
Shailesh

Вы можете использовать это:

Цель 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

147
mprivat

Обновлено для Swift 3

    if let frame = yourViewName.superview?.convert(yourViewName.frame, to: nil) {

        print(frame)
    }

 enter image description here

15
iajmeri43

Хотя это и не относится к кнопке в иерархии, как было предложено, я обнаружил, что это легче визуализировать и понять: 

Отсюда: первоисточник

 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)
13
Vlad

Рамка: (X, Y, ширина, высота). 

Следовательно, ширина и высота не изменятся даже в супер-супер-виде. Вы можете легко получить X, Y следующим образом.

X = button.frame.Origin.x + [button superview].frame.Origin.x;
Y = button.frame.Origin.y + [button superview].frame.Origin.y;
6
iRavi iVooda

Вы можете легко получить супер-супер вид следующим образом.

secondView -> [кнопка суперпредставления]
firstView -> [[superview] кнопка] superview]

Затем вы можете получить положение кнопки ..

Вы можете использовать это:

xPosition = [[button superview] superview].frame.Origin.x;
yPosition = [[button superview] superview].frame.Origin.y;
1
said altintop

Если есть несколько стеков, и вам не нужно (или не нужно) знать какие-либо возможные виды между интересующими вас представлениями, вы можете сделать это:

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 не является baseView (т.е. между кнопкой и viewcontroller.view есть другие представления), преобразованная координата извлекается и передается следующему суперпредставлению. 
Он продолжает делать то же самое через стек представлений, движущихся в направлении baseView. 
Как только он достигает baseView, он делает одно последнее преобразование и возвращает его.
Примечание: он не обрабатывает ситуацию, когда targetView расположен под baseView.

0
Rexb