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