iPhone - Получить позицию UIView в пределах всего окна UIWindow


206

UIViewОчевидно, что позиция a может быть определена с помощью view.centerили view.frameи т. Д., Но это только возвращает позицию UIViewотносительно ее непосредственного суперпредставления.

Мне нужно определить положение UIViewво всей системе координат 320x480. Например, если UIViewэто в UITableViewCellего положение в окне может резко измениться в Вне зависимости от надтаблицы.

Есть идеи, если и как это возможно?

Ура :)

Ответы:


340

Это легко:

[aView convertPoint:localPosition toView:nil];

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

[aView.superview convertPoint:aView.frame.origin toView:nil];

Редактирование 2014 года: Глядя на популярность комментария Matt__C, кажется разумным указать, что координаты ...

  1. не меняйте при вращении устройства.
  2. всегда имеют свое происхождение в левом верхнем углу не повернутого экрана.
  3. являются координатами окна : система координат не определяется границами окна. Системы координат экрана и устройства различны и не должны смешиваться с координатами окна.

круто :) Я думал, что это должно быть просто, но у меня было чувство, что яблоко не даст это так легко ... ну, они сделали. спасибо
Лиор Френкель

41
Имейте в виду, что указание nil в параметре toView дает вам координаты устройства, что не будет тем, что вы хотите, если вы не находитесь в портретной ориентации. См convertpointtoview-в-ландшафтном режиме, давая-неправильные значения
Matt__C

2
Этот метод продолжал возвращаться aView.frame.originдля меня. Мне потребовалось время, чтобы понять, что у суперпредставления моей точки зрения нет самой суперпредставления.
Дан Абрамов

3
Если у вашего superView не было superView, ваш вид не должен отображаться вообще
user4951

17
Приспосабливая связанное решение @Matt__C к вашему делу, оно станет:[view.superview convertPoint:view.frame.origin toView:[UIApplication sharedApplication].keyWindow.rootViewController.view]
Ghigo


33

Swift 3, с удлинителем:

extension UIView{
    var globalPoint :CGPoint? {
        return self.superview?.convert(self.frame.origin, to: nil)
    }

    var globalFrame :CGRect? {
        return self.superview?.convert(self.frame, to: nil)
    }
}


9

Вот комбинация ответа @Mohsenasm и комментария от @Chigo, принятого для Swift

extension UIView {
    var globalFrame: CGRect? {
        let rootView = UIApplication.shared.keyWindow?.rootViewController?.view
        return self.superview?.convert(self.frame, to: rootView)
    }
}

просто и приятно!
Настасья
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.