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

我已经看了十几个关于这个话题的SO问题,没有任何答案对我有用。 也许这会帮助我走上正确的道路。

想象一下这个设置:

在这里输入图像说明

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

换句话说,UIButton中心可能是215,80内的UITableViewCell,但相对于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 

我可以通过循环遍历button的所有超级视图并添加x和y坐标来实现,但我怀疑这是过度的。 我只需要find正确的covertPoint设置组合。 对?

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

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

或者你在自己的坐标系中计算button的中心,并使用:

 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 3

 var p = button.convertPoint(button.center, to: self.view) 

马丁的回答是正确的。 对于使用Swift的开发人员,您可以使用以下命令获取对象(button,视图,…)相对于屏幕的位置:

 var p = obj.convertPoint(obj.center, toView: self.view) println(px) // this prints the x coordinate of 'obj' relative to the screen println(py) // 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) } 

这里是@Pablo答案的Swift 3更新,对我来说这非常好。

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