iPhone - Отримайте позицію UIView протягом усього вікна UIW


206

Позиція позиції, UIViewочевидно, може бути визначена view.centerабо view.frameтощо, але це лише повертає позицію UIViewпо відношенню до його негайного нагляду.

Мені потрібно визначити положення UIViewв цілій системі координат 320х480. Наприклад, якщо положення UIViewстоїть в UITableViewCellйого положенні всередині вікна, це може різко змінитися незалежно від нагляду.

Будь-які ідеї, якщо і як це можливо?

Ура :)

Відповіді:


340

Це просто:

[aView convertPoint:localPosition toView:nil];

... перетворює точку в місцевому просторі координат у координати вікна. Ви можете використовувати цей метод для обчислення походження подання у вікні, наприклад, таким:

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

2014 Редагувати: Дивлячись на популярність коментаря Matt__C, здається, розумне зазначити, що координати ...

  1. не змінюватись при обертанні пристрою.
  2. завжди мають своє походження у верхньому лівому куті екранованого екрана.
  3. - це координати вікон : Система координат ist визначається межами вікна. Системи координат екрана та пристрою різні, і їх не слід змішувати з координатами вікон.

приголомшливо :) Я думав, що це повинно бути просто, але я мав відчуття, що яблуко не дасть це так просто ... ну вони це зробили. дякую
Lior Frenkel

41
Майте на увазі, що вказуючи нуль у параметрі toView, ви отримуєте координати пристрою, що не буде тим, що вам потрібно, якщо ви не перебуваєте в портретному орієнтації. Див. Converpointtoview в ландшафтному режимі, що дає неправильні значення
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, прийнятого до Свіфта

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.