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
49

Свифт 5, Свифт 4 :

let globalPoint = aView.superview?.convert(aView.frame.origin, to: nil)
Ючен Чжун
источник
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)
    }
}
Mohsenasm
источник
30

В Свифте:

let globalPoint = aView.superview?.convertPoint(aView.frame.origin, toView: 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)
    }
}
Влад Спрейс
источник
просто и приятно!
Настасья