Geoff Hackworth
1 min readMay 22, 2018

--

> let convertToWindow = subview.convert(subview.frame, to: window)

Are you sure that’s correct? The documentation says “Converts a rectangle from the receiver’s coordinate system to that of another view.”

The receiver is subview but the rectangle you are passing is the subview’s frame, which is in the coordinate system of its superview (`view`). This is the classic frame/bounds confusion.

I think these will do the right thing (the first one relies on knowing that view is subview's superview, the other just uses the superview):

let convertToWindow = view.convert(subview.frame, to: window)

let convertToWindow = subview.superview.convert(subview.frame, to: window)

Thinking about it differently, rootView is at the origin of the window, so will have no effect. view is at 25,25 and subview is at 25,25 within view. So the origin of subview in window's coordinate system will be 50,50 and not 75,75 as your article (currently) states.

As an aside, I prefer to use the “from” rather than “to” versions. It helps me think in the coordinate system of where I’m converting *to*, rather than where I’m coming *from*. They are equivalent, but this way the message is sent to the view that the rect will be used with.

let convertToWindow = window.convert(subview.frame, from: view)

let convertToWindow = window.convert(subview.frame, from: subview.superview)

I *think* my examples are correct. Apologies if I got it wrong! ;-)

--

--

Geoff Hackworth
Geoff Hackworth

Written by Geoff Hackworth

Independent and freelance software developer for iPhone, iPad and Mac

Responses (1)