75

我已经查看了有关该主题的十几个 SO 问题,但没有一个答案对我有用。也许这会帮助我回到正确的道路上。

想象一下这个设置:

在此处输入图像描述

我想获取centerUIButton 相对于 UIView 的坐标。

换句话说,UIButton 中心在 UITableViewCell 内可能是 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 坐标来实现这一点,但我怀疑这太过分了。我只需要找到covertPoint 设置的正确组合。对?

4

5 回答 5

140

button.center是在其 superview的坐标系中指定的中心,所以我假设以下工作:

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];

斯威夫特 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)
于 2013-04-08T15:45:33.143 回答
18

Swift 5.2

您需要convert从按钮调用,而不是超级视图。在我的情况下,我需要宽度数据,所以我转换了边界,而不仅仅是中心点。下面的代码对我有用:

let buttonAbsoluteFrame = button.convert(button.bounds, to: self.view)
于 2018-02-26T21:24:02.453 回答
14

马丁的回答是正确的。对于使用 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
于 2014-11-19T07:01:22.437 回答
9

这是@Pablo 答案的Swift 3更新,在我的情况下当然效果很好。

if let window = UIApplication.shared.keyWindow {
    parent.convert(child.frame.origin, to: window)
}
于 2017-03-07T19:48:35.733 回答
1

在 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)
    }
于 2016-05-05T14:28:15.263 回答