46

I do not quite understand the method convertPoint:toView:.

In Apple's documentation it is written that

convertPoint:toView:

Converts a point from the receiver’s coordinate system to that of the specified view.

- (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view

But what does converting a point from one to the other actually mean?

Does it imply that the points in both bounds have different units? Or just different values?

If it is the latter, why is there such a method when we can simply assign the value of a's contentOffset to b's ?

CGPoint a = [a contentOffset];
[b setContentOffset:a];

How is convertPoint:toView: different from simply assigning contentOffset? Or did I misunderstand the entire concept? What does converting points actually do? When should this method be used?

jscs
  • 63,694
  • 13
  • 151
  • 195
  • I believe it's got something to do with `view.transform`. – Cyrille Feb 27 '13 at 10:43
  • @Cyrille What does view.transform do? Assigning center property to another view? – Help - I need somebody's help Feb 27 '13 at 10:47
  • http://stackoverflow.com/questions/2081753/getting-the-bounds-of-an-mkmapview – Rajneesh071 Feb 27 '13 at 10:48
  • @Rajneesh071 Thanks for the link but I still don't quite get it... – Help - I need somebody's help Feb 27 '13 at 10:54
  • @cartogram The `transform` property allows you to scale, translate, rotate any view (with hardware acceleration, FWIW). It's used internally to handle auto-rotation of your app for example : the main `UIWindow` is always portrait even if you hold your iPad landscape, and a `rotate 90° + translate to center` transform is applied to it.. The conversion between portrait and landscape coordinates is done with the `convertPoint:fromWindow:` function, IIRC. – Cyrille Feb 27 '13 at 11:13

1 Answers1

125

Every UIView has its own coordinates system. So if you have a UIView_1 that contains another UIView_2, they both have a point (10,10) within them.

convertPoint:toView: allows the developer to take a point in one view and convert the point to another view coordinate system.

Example: view1 contains view2. The top left corner of view2 is located at view1 point (10,10), or better to say view2.frame.orgin = {10,10}. That {10,10} is based in the view1 coordinate system. So far so good.

The user touches the view2 at point {20,20} inside the view2. Now those coordinates are in the view2 coordinate system. You can now use covertPoint:toView: to convert {20,20} into the coordinate system of view1. touchPoint = {20,20}

CGPoint pointInView1Coords = [view2 convertPoint:touchPoint toView:view1];

So now pointInView1Coords should be {30,30} in the view1 coordinate systems. Now that was just simple math on this example, but there are all sorts of things that contribute to the conversion. Transforms and scaling come to mind.

Read about UIView frame, bounds, and center. They are all related and they deal with coordinate systems for a view. Its confusing until you start doing stuff with them. Remember this frame and center are in the parent's coordinate system. Bounds is in the view's coordinate system.

John

John
  • 2,640
  • 1
  • 16
  • 16