使用 ConvertPoint 获取父 UIView 中的相对位置

关于这个话题,我已经看了一打这样的问题,没有一个答案对我有用。也许这能帮我重回正轨。

想象一下这种设置:

enter image description here

我想得到相对于 UIView 的 UIButton 的 center坐标。

换句话说,UITableViewCell 中的 UIButton 中心可能是215,80,但是相对于 UIView,它们应该更接近于260,165。如何在两者之间转换?

以下是我试过的方法:

[[self.view superview] convertPoint:button.center fromView:button];  // fail
[button convertPoint:button.center toView:self.view];  // fail
[button convertPoint:button.center toView:nil];  // fail
[button convertPoint:button.center toView:[[UIApplication sharedApplication] keyWindow]];  // fail

我可以通过循环遍历所有按钮的超视图并加上 x 和 y 坐标来完成这项工作,但我怀疑这样做有些过头了。我只需要找到涵盖点设置的正确组合。对吧?

64354 次浏览

button.center是在坐标系内指定的中心,所以我 假设下列方法可行:

CGPoint p = [button.superview convertPoint:button.center toView:self.view]

或者你可以计算按钮的坐标系,然后使用:

CGPoint buttonCenter = CGPointMake(button.bounds.origin.x + button.bounds.size.width/2,
button.bounds.origin.y + button.bounds.size.height/2);
CGPoint p = [button convertPoint:buttonCenter toView:self.view];

Swift 4 +

let p = button.superview!.convert(button.center, to: self.view)


// or


let buttonCenter = CGPoint(x: button.bounds.midX, y: button.bounds.midY)
let p = button.convert(buttonCenter, to: self.view)

马丁的回答是正确的。对于使用 Swift 的开发人员,您可以通过以下方法获得对象(按钮、视图、 ...)相对于屏幕的位置:

var p = obj.convertPoint(obj.center, toView: self.view)


println(p.x)  // this prints the x coordinate of 'obj' relative to the screen
println(p.y)  // this prints the y coordinate of 'obj' relative to the screen

在 Swift 2.2版本中对我很有用:

var OrignTxtNomeCliente:CGPoint!


if let orign = TXT_NomeCliente.superview, let win = UIApplication.sharedApplication().keyWindow {
OrignTxtNomeCliente = orign.convertPoint(TXT_NomeCliente.frame.origin, toView: win)
}

以下是 Swift 3对@Pablo 的回答的更新,这个回答在我的案例中非常有效。

if let window = UIApplication.shared.keyWindow {
parent.convert(child.frame.origin, to: window)
}

Swift 5.2 < br > < br > 您需要从按钮调用 convert,而不是从 Superview。在我的例子中,我需要宽度数据,所以我转换了边界,而不仅仅是中心点。下面的代码对我很有用:

let buttonAbsoluteFrame = button.convert(button.bounds, to: self.view)