使用convertPoint获取父级UIView内的相对位置

78

我看了一打关于这个主题的SO问题,但是没有一个答案对我有用。也许这会帮助我重新找到正确的方向。

想象一下这样的设置:

enter image description here

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

换句话说,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坐标来做到这一点,但我认为那样太过冗长。我只需要找到合适的convertPoint设置组合即可。对吗?


如果你在问题中加入以下内容,会更有帮助:你图像中所有 4 个视图的框架,你所尝试方法的输出结果,以及你实际想要的值。 - rmaddy
5个回答

146

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)

3
太棒了!你第一次尝试的结果正是我要找的。将中心点绑定到父视图的坐标系是我缺失的部分。谢谢! - Axeva
谢谢@Martin R。这很有帮助。 - Chamath Jeevan
2
Swift 3: var buttonCenter = CGPoint(x: button.bounds.origin.x + button.bounds.size.width / 2, y: button.bounds.origin.y + button.bounds.size.height / 2) var p = button.convertPoint(buttonCenter, to: self.view) - Matt Butler
那么 Swift 4 版本缺少了 .superview?,对吗? - de.
1
@de.: 你是对的!希望现在正确了。 - Martin R

20

Swift 5.2

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

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

命名框架很令人困惑,因为边界的frame.origin是零。如果您只需使用button.bounds获取宽度,为什么要调用convert呢?如果您确实需要获取视图的相对坐标,则请使用convert(button.frame...)。 - Almas Adilbek

14

Martin的回答是正确的。对于使用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

1
@Axeva 还有一个convertRect可以进行更精确的计算这里 - Juan Boero

11

这是 @Pablo 答案的 Swift 3 更新,对我的情况非常有效。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接