UIView
的位置可以通过view.center
或view.frame
等方式确定,但这只返回UIView
相对于其直接父视图的位置。
我需要确定UIView
在整个320x480坐标系统中的位置。例如,如果UIView
在UITableViewCell
中,则其在窗口中的位置可能会发生剧烈变化,而不考虑其父视图。
是否有任何想法可以实现这一点?
UIView
的位置可以通过view.center
或view.frame
等方式确定,但这只返回UIView
相对于其直接父视图的位置。
我需要确定UIView
在整个320x480坐标系统中的位置。例如,如果UIView
在UITableViewCell
中,则其在窗口中的位置可能会发生剧烈变化,而不考虑其父视图。
是否有任何想法可以实现这一点?
这很简单:
[aView convertPoint:localPosition toView:nil];
...将本地坐标空间中的点转换为窗口坐标。您可以使用此方法来计算视图在窗口空间中的原点,如下所示:
[aView.superview convertPoint:aView.frame.origin toView:nil];
2014 年修订: 鉴于 Matt__C 评论的受欢迎程度,指出以下内容似乎是合理的:
Swift 5+:
let globalPoint = aView.superview?.convert(aView.frame.origin, to: nil)
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)
}
}
在 Swift 中:
let globalPoint = aView.superview?.convertPoint(aView.frame.origin, toView: nil)
这是根据 @Mohsenasm 的回答和 @Ghigo 的评论结合起来的 Swift 版本。
extension UIView {
var globalFrame: CGRect? {
let rootView = UIApplication.shared.keyWindow?.rootViewController?.view
return self.superview?.convert(self.frame, to: rootView)
}
}
extension UIView {
var globalFrame: CGRect {
return convert(bounds, to: window)
}
}
对我而言,这段代码表现最佳:
private func getCoordinate(_ view: UIView) -> CGPoint {
var x = view.frame.origin.x
var y = view.frame.origin.y
var oldView = view
while let superView = oldView.superview {
x += superView.frame.origin.x
y += superView.frame.origin.y
if superView.next is UIViewController {
break //superView is the rootView of a UIViewController
}
oldView = superView
}
return CGPoint(x: x, y: y)
}
view.layoutIfNeeded() // this might be necessary depending on when you need to get the frame
guard let keyWindow = UIApplication.shared.windows.first(where: { $0.isKeyWindow }) else { return }
let frame = yourView.convert(yourView.bounds, to: keyWindow)
print("frame: ", frame)
aView.frame.origin
。花了我一段时间才意识到我的视图的超级视图本身没有超级视图。 - Dan AbramovUIWindow
派生自UIView
。 - Nikolai Ruhe[view.superview convertPoint:view.frame.origin toView:[UIApplication sharedApplication].keyWindow.rootViewController.view]
。 - Ghigo