convertRect:和convertPoint:使用

在使用convertRect: toView:转换时,遇到一个问题,记录下自己的理解,不对的请指出。
例如:tableView上的cell,tableView的frame为{0,100,屏幕width,屏幕height-100},我想把cell.frame转换到controller的view上,得到对应frame,我之前使用方法是这样实现,在controller中调用

[cell convertRect:cell.frame toView:self.view];

但是输出数据并不正确,如cell.frame为{100,100,200,200},转换后输出{200,300,200,200},这里明显不对,应该输出{100,200,200,200}才对,为什么会这样?
这里我们可以看出,当前对象objc的 x方向是

objc.frame.origin.x*2+objc.superview.frame.origin.x + objc.superview.superview.frame.origin.x... 

这里直到下个父视图是toview对象停止;如我们上面的cell,cell.superview就是tableview,即100x2+0; y方向是同理100x2+100。
为了验证是否正确,我们换个frame,如{134,160,200,200}, 同样的调用方式,输出为{268,420,200,200},这里验证成功。
再举个例子,cell上面有个btn,把btn.frame转换为controller的view上;假设btn.frame为{20,15,50,50},cell的frame为{120,140,cell.width,cell.height},同样我们做如下操作

[btn convertRect:btn.frame toView:self.view];

输出结果为{160,270,50,50},是不是符合上面的公式

{btn.x*2+cell.x+tableView.x,btn.y*2+cell.y+tableView.y,btn.width,btn.height}

为什么会这样?
其实原因是这样,convertRect:toView: 调用者很重要,这个调用者应该为frame所在的视图对象。上面cell的frame应该是cell.superview上的,即tableView,如果我们使用当前对象cell去调用,系统会认为这个frame是相对cell的frame,即cell上对应frame的位置转换到了self.view上,多算了一个x和y,所以会出现x*2。

示意图.jpg

如上面的图片所示,上面调用都是把当前frame移位后才转换。
所以,这里我们需要使用下面的方调用才正确

[cell.superview convertRect:cell.frame toView:self.view];
[btn.superview convertRect:btn.frame toView:self.view];

或者

[self.view convertRect:cell.frame fromView:cell.superview];
[self.view convertRect:btn.frame fromView:btn.superview];

同理convertPoint也一样。

你可能感兴趣的:(convertRect:和convertPoint:使用)