iPhone - Obtenha a posição do UIView em toda a UIWindow

206

UIViewObviamente, a posição de a pode ser determinada por view.centerou view.frameetc., mas isso apenas retorna a posição de UIViewem relação à sua visão geral imediata.

Preciso determinar a posição de UIViewtodo o sistema de coordenadas 320x480. Por exemplo, se a posição UIViewestiver na UITableViewCelljanela pode mudar drasticamente, independentemente da superview.

Alguma idéia se e como isso é possível?

Felicidades :)

Adão
fonte

Respostas:

340

Essa é fácil:

[aView convertPoint:localPosition toView:nil];

... converte um ponto no espaço de coordenadas locais em coordenadas da janela. Você pode usar este método para calcular a origem de uma visualização no espaço da janela, como este:

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

2014 Edit: Olhando para a popularidade do comentário de Matt__C, parece razoável apontar que as coordenadas ...

  1. não mude ao girar o dispositivo.
  2. sempre têm sua origem no canto superior esquerdo da tela não rotacionada.
  3. são coordenadas da janela : O sistema de coordenadas não é definido pelos limites da janela. Os sistemas de coordenadas da tela e do dispositivo são diferentes e não devem ser misturados às coordenadas da janela.
Nikolai Ruhe
fonte
awesome :) Eu pensei que deveria ser simples, mas eu tinha a sensação de que a maçã não daria tão fácil ... bem, eles fizeram. obrigado
Lior Frenkel
41
Esteja ciente de que especificar nada no parâmetro toView fornece coordenadas do dispositivo, o que não será o que você deseja se não estiver na orientação retrato. Veja convertpointtoview-em-modo paisagem que dá-erradas valores
Matt__C
2
Esse método continuava voltando aView.frame.originpara mim. Levei um tempo para perceber que a super visão da minha visão não tinha uma super visão em si.
Dan Abramov
3
Se o seu superView não tiver um superView, a sua visualização não deve ser vista de forma alguma
user4951
17
Adaptando a solução vinculada @Matt__C ao seu caso, ele se tornaria: #[view.superview convertPoint:view.frame.origin toView:[UIApplication sharedApplication].keyWindow.rootViewController.view]
Ghigo 31/10
49

Swift 5, Swift 4 :

let globalPoint = aView.superview?.convert(aView.frame.origin, to: nil)
Yuchen Zhong
fonte
33

Swift 3, com extensão:

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
fonte
30

Em Swift:

let globalPoint = aView.superview?.convertPoint(aView.frame.origin, toView: nil)
Shlomi Schwartz
fonte
9

Aqui está uma combinação da resposta de @Mohsenasm e um comentário de @Chigo adotado para Swift

extension UIView {
    var globalFrame: CGRect? {
        let rootView = UIApplication.shared.keyWindow?.rootViewController?.view
        return self.superview?.convert(self.frame, to: rootView)
    }
}
Vlad Spreys
fonte
simples e agradável!
nastassia