iPhone-在整个UIWindow中获取UIView的位置


206

UIView很明显,a的位置可以由view.centerview.frame等确定,但这仅返回其相对UIView于其直接父视图的位置。

我需要确定UIView整个320x480坐标系中的位置。例如,如果UIView是在UITableViewCell窗口内它的位置可能会改变大大irregardless的上海华盈的。

有什么想法,以及如何做到这一点?

干杯:)

Answers:


339

这很简单:

[aView convertPoint:localPosition toView:nil];

...将局部坐标空间中的点转换为窗口坐标。您可以使用此方法来计算窗口空间中的视图原点,如下所示:

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

2014编辑:看着Matt__C评论的流行,似乎有理由指出坐标...

  1. 旋转设备时不要改变。
  2. 始终将其原点放在未旋转的屏幕的左上角。
  3. 窗口坐标:由窗口范围定义的坐标系。屏幕和设备坐标系是不同的,不应与窗口坐标混淆。

太棒了:)我以为它应该很简单,但是我觉得苹果不会这么简单...他们做到了。谢谢
Lior Frenkel

41
请注意,在toView参数中指定nil会为您提供设备坐标,如果您不是纵向的,那么坐标就不是您想要的。参见convertpointtoview-in-landscape-mode-
giving-

2
这种方法一直aView.frame.origin为我效劳。我费了些力气才意识到我的观点的超级观点本身没有超级观点。
Dan Abramov

3
如果您的超级视图没有超级视图,则根本不应看到您的视图
user4951 2013年

17
使@Matt__C链接解决方案适合您的情况,将变成:[view.superview convertPoint:view.frame.origin toView:[UIApplication sharedApplication].keyWindow.rootViewController.view]
Ghigo

49

Swift 5,Swift 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)
    }
}


9

这是@Mohsenasm的答案和@Chigo对Swift的评论的结合

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

简单好看!
凌晨
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.