Подтвердить что ты не робот

Получить позицию 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" ?

4b9b3361

Ответ 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)