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

atmip9wb  于 2022-12-24  发布在  iOS
关注(0)|答案(8)|浏览(780)

UIView的位置显然可以通过view.centerview.frame等来确定,但这只返回UIView相对于其直接超视图的位置。
我需要确定UIView在整个320x480坐标系中的位置。例如,如果UIViewUITableViewCell中,则无论在哪个超级视图中,它在窗口中的位置都会发生显著变化。
你知道这是否可能以及如何可能吗?

83qze16e

83qze16e1#

这很简单

[aView convertPoint:localPosition toView:nil];

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

[aView.superview convertPoint:aView.frame.origin toView:nil];
    • 2014年编辑:**看看Matt__C评论的受欢迎程度,似乎有理由指出坐标...

1.旋转器械时不要改变。
1.始终使其原点位于未旋转屏幕的左上角。
1.是窗口坐标:坐标系由窗口的边界定义。屏幕和设备的坐标系不同,不应与窗口坐标混淆。

byqmnocz

byqmnocz2#

雨燕5+

let globalPoint = aView.superview?.convert(aView.frame.origin, to: nil)
liwlm1x9

liwlm1x93#

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)
    }
}
yrwegjxp

yrwegjxp4#

在Swift中:

let globalPoint = aView.superview?.convertPoint(aView.frame.origin, toView: nil)
pbwdgjma

pbwdgjma5#

下面是@Mohsenasm的回答和@Ghigo的评论,它们被Swift采纳

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

9bfwbjaz6#

对我来说,这个代码工作得最好:

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)
}
nnvyjq4y

nnvyjq4y7#

这对我很有效

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)
cdmah0mi

cdmah0mi8#

对我来说效果很好:)

extension UIView {
    var globalFrame: CGRect {
        return convert(bounds, to: window)
    }
}

相关问题