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的评论的受欢迎程度,似乎有理由指出坐标…
转动设备时不要改变。 始终让它们的原点位于未旋转屏幕的左上角。 是窗口坐标:由窗口边界定义的坐标系统。屏幕和设备的坐标系统是不同的,不应该与窗口坐标混淆。
其他回答
对我来说很有用:)
extension UIView {
var globalFrame: CGRect {
return convert(bounds, to: window)
}
}
这很简单:
[aView convertPoint:localPosition toView:nil];
... 将局部坐标空间中的点转换为窗口坐标。你可以使用这个方法来计算视图在窗口空间中的原点,如下所示:
[aView.superview convertPoint:aView.frame.origin toView:nil];
2014编辑:看看Matt__C的评论的受欢迎程度,似乎有理由指出坐标…
转动设备时不要改变。 始终让它们的原点位于未旋转屏幕的左上角。 是窗口坐标:由窗口边界定义的坐标系统。屏幕和设备的坐标系统是不同的,不应该与窗口坐标混淆。
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的回答和@Ghigo对Swift的评论
extension UIView {
var globalFrame: CGRect? {
let rootView = UIApplication.shared.keyWindow?.rootViewController?.view
return self.superview?.convert(self.frame, to: rootView)
}
}
这对我很有效
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)