Re: UIView final frame after device rotation

2013-04-03 Thread Markus Spoettl

On 4/3/13 12:47 AM, Quincey Morris wrote:

On Apr 2, 2013, at 14:21 , Markus Spoettl ms_li...@shiftoption.com
mailto:ms_li...@shiftoption.com wrote:


Not sure if I understand what you're saying, but if that was the case, the
view's frame I'm attaching the overlay to would turn out wrong if the device
is rotated.


No, once the rotation is complete (at least), there'd be no transform any more,
and so the frame would then be valid.


Ah, OK you're right.


The only time I get a bogus view frame is when the rotation notification is
delivered.


It would be easy to try examining the bounds and center properties at the
time of the notification, and see whether *they* are bogus. If not, you should
be able to orient your child view using those two properties, instead of using
frame.


bounds and center are correct at all times. However, I need the view's frame in 
screen coordinates because I'm positioning an independent overlay window, not a 
subview. Since the transformation messes with -convertRect:from/toView: in my 
view hierarchy, I have no idea how to get to the frame I'm interested in. Any ideas?


Regards
Markus
--
__
Markus Spoettl
___

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com


Re: UIView final frame after device rotation

2013-04-03 Thread Quincey Morris
On Apr 3, 2013, at 00:16 , Markus Spoettl ms_li...@shiftoption.com wrote:

 bounds and center are correct at all times. However, I need the view's frame 
 in screen coordinates because I'm positioning an independent overlay window, 
 not a subview. Since the transformation messes with -convertRect:from/toView: 
 in my view hierarchy, I have no idea how to get to the frame I'm interested 
 in. Any ideas?


It might be easier just not to work with the frame at all. I suspect you can 
use 'convertPoint:…' on the center to get to the coordinate system you need for 
the attached view, then use that and the bounds to compute the attached view's 
center and bounds.

___

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Re: UIView final frame after device rotation

2013-04-03 Thread Markus Spoettl

On 4/3/13 6:42 PM, Quincey Morris wrote:

bounds and center are correct at all times. However, I need the view's frame
in screen coordinates because I'm positioning an independent overlay window,
not a subview. Since the transformation messes with -convertRect:from/toView:
in my view hierarchy, I have no idea how to get to the frame I'm interested
in. Any ideas?


It might be easier just not to work with the frame at all. I suspect you can use
'convertPoint:…' on the center to get to the coordinate system you need for the
attached view, then use that and the bounds to compute the attached view's
center and bounds.


I'll try that, thanks for the suggestion!

Regards
Markus
--
__
Markus Spoettl
___

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

UIView final frame after device rotation

2013-04-02 Thread Markus Spoettl

Hi,

  I have a hard time figuring out how to get the frame (in the window 
coordinate system) a view will rotate to, when the rotation has just begun.


I'm observing UIApplicationDidChangeStatusBarFrameNotification on 
NSNotification's defaultCenter. When this notification is delivered, the 
rotation seems to be in progress. At that point I need to know the final frame 
the view is being rotated to.


I've tried everything I could think of including these:

r1 = [[view superview] convertRect:[view frame] toView:nil];
r2 = [[view window] convertRect:[view bounds] fromView:view];
r3 = [view convertRect:[view bounds] toView:nil];
r4 = [[view window] convertRect:[[[view layer] modelLayer] frame] fromView:[view 
superview]];


All get me the same results all the time (expected) but depending on the 
rotation direction and the previous orientation, I get nonsensical results like


{{52, 0}, {268, 480}}

or

{{-80, 80}, {416, 320}}

for a window-filling view (with a navigation bar visible). This led me to 
believe that I'm getting coordinates the view is set up to rotate from when the 
orientation changes. I can't for the life of me find a way to get the new frame 
that the view will have when the animation is complete.


I feel like I'm missing something obvious, any ideas?

Regards
Markus
--
__
Markus Spoettl
___

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com


Re: UIView final frame after device rotation

2013-04-02 Thread David Duncan
On Apr 2, 2013, at 10:59 AM, Markus Spoettl ms_li...@shiftoption.com wrote:

  I have a hard time figuring out how to get the frame (in the window 
 coordinate system) a view will rotate to, when the rotation has just begun.

What are you trying to do?

Typically you don't need to worry about this. The root view controller's view 
will have its frame set properly by UIKit, and then all of your other views 
will resize with respect to that view's bounds, and as such you don't need to 
know how to get the final frame of that view.

 
 I'm observing UIApplicationDidChangeStatusBarFrameNotification on 
 NSNotification's defaultCenter. When this notification is delivered, the 
 rotation seems to be in progress. At that point I need to know the final 
 frame the view is being rotated to.
 
 I've tried everything I could think of including these:
 
 r1 = [[view superview] convertRect:[view frame] toView:nil];
 r2 = [[view window] convertRect:[view bounds] fromView:view];
 r3 = [view convertRect:[view bounds] toView:nil];
 r4 = [[view window] convertRect:[[[view layer] modelLayer] frame] 
 fromView:[view superview]];
 
 All get me the same results all the time (expected) but depending on the 
 rotation direction and the previous orientation, I get nonsensical results 
 like
 
 {{52, 0}, {268, 480}}
 
 or
 
 {{-80, 80}, {416, 320}}
 
 for a window-filling view (with a navigation bar visible). This led me to 
 believe that I'm getting coordinates the view is set up to rotate from when 
 the orientation changes. I can't for the life of me find a way to get the new 
 frame that the view will have when the animation is complete.
 
 I feel like I'm missing something obvious, any ideas?
 
 Regards
 Markus
 -- 
 __
 Markus Spoettl
 ___
 
 Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
 
 Please do not post admin requests or moderator comments to the list.
 Contact the moderators at cocoa-dev-admins(at)lists.apple.com
 
 Help/Unsubscribe/Update your Subscription:
 https://lists.apple.com/mailman/options/cocoa-dev/david.duncan%40apple.com
 
 This email sent to david.dun...@apple.com

--
David Duncan


___

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com


Re: UIView final frame after device rotation

2013-04-02 Thread Markus Spoettl

On 4/2/13 8:37 PM, David Duncan wrote:

I have a hard time figuring out how to get the frame (in the window
coordinate system) a view will rotate to, when the rotation has just
begun.


What are you trying to do?

Typically you don't need to worry about this. The root view controller's view
will have its frame set properly by UIKit, and then all of your other views
will resize with respect to that view's bounds, and as such you don't need to
know how to get the final frame of that view.


I'm displaying an overlay window which is attached to the view in question. 
When the rotation takes place, it needs to realign itself so that it's new 
location agrees with what the view displays (in my context).


Regards
Markus
--
__
Markus Spoettl
___

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com


Re: UIView final frame after device rotation

2013-04-02 Thread David Duncan
On Apr 2, 2013, at 1:25 PM, Markus Spoettl ms_li...@shiftoption.com wrote:

 On 4/2/13 8:37 PM, David Duncan wrote:
 I have a hard time figuring out how to get the frame (in the window
 coordinate system) a view will rotate to, when the rotation has just
 begun.
 
 What are you trying to do?
 
 Typically you don't need to worry about this. The root view controller's view
 will have its frame set properly by UIKit, and then all of your other views
 will resize with respect to that view's bounds, and as such you don't need to
 know how to get the final frame of that view.
 
 I'm displaying an overlay window which is attached to the view in question.

I would think there might be an easier way to do this rather than using an 
overlay window, but I'm not entirely certain what your end goal is or what you 
are trying to overlay. You might consider an approach that uses view controller 
containment however.

 When the rotation takes place, it needs to realign itself so that it's new 
 location agrees with what the view displays (in my context).


Have you tried doing this inside of -viewDidLayoutSubviews for the view 
controller that is managing all of this? That should be the best place to get 
the location of views after the layout has completed, although the animation 
information would need to be obtained seperately.
--
David Duncan


___

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com


Re: UIView final frame after device rotation

2013-04-02 Thread Quincey Morris
On Apr 2, 2013, at 13:25 , Markus Spoettl ms_li...@shiftoption.com wrote:

 I'm displaying an overlay window which is attached to the view in question. 
 When the rotation takes place, it needs to realign itself so that it's new 
 location agrees with what the view displays (in my context).

Isn't it a mistake to tie this to rotation? IIRC there are other reasons the 
root view might be resized (e.g. squished to make room for the status bar or 
not? notifications?). You probably want to adjust your child view location in 
those cases too.

IAC you might be safer to avoid using the frame. If there's a transform 
involved in the view's rotation, then the frame property will be meaningless. 
(But IDK if there's actually a transform applied to the view during rotation, 
or whether there's just a rotating animation.)

___

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com


Re: UIView final frame after device rotation

2013-04-02 Thread Markus Spoettl

On 4/2/13 10:39 PM, David Duncan wrote:

On Apr 2, 2013, at 1:25 PM, Markus Spoettl ms_li...@shiftoption.com wrote:


On 4/2/13 8:37 PM, David Duncan wrote:

I have a hard time figuring out how to get the frame (in the window
coordinate system) a view will rotate to, when the rotation has just
begun.


What are you trying to do?

Typically you don't need to worry about this. The root view controller's
view will have its frame set properly by UIKit, and then all of your
other views will resize with respect to that view's bounds, and as such
you don't need to know how to get the final frame of that view.


I'm displaying an overlay window which is attached to the view in
question.


I would think there might be an easier way to do this rather than using an
overlay window, but I'm not entirely certain what your end goal is or what
you are trying to overlay. You might consider an approach that uses view
controller containment however.


Actually I did experiment with using embedded views instead of an overlay window 
but it was a lot easier to make it work that way. The overlay window lets us 
completely separate the overlay from the view's hierarchy.


It would be an architectural problem to move that into the view hierarchy.


When the rotation takes place, it needs to realign itself so that it's new
location agrees with what the view displays (in my context).


Have you tried doing this inside of -viewDidLayoutSubviews for the view
controller that is managing all of this? That should be the best place to get
the location of views after the layout has completed, although the animation
information would need to be obtained seperately. -- David Duncan


No, I haven't tried that, not sure if you mean this would apply to an overlay 
solution. I'll see if I can figure out a way to use that.


Still, there must be a way to get to the target view's frame before the 
animation is complete, no? When device rotation is complete, the view frame is 
correct. It's only ever wrong when the rotation notification is delivered.


Regards
Markus
--
__
Markus Spoettl
___

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com


Re: UIView final frame after device rotation

2013-04-02 Thread Markus Spoettl

On 4/2/13 10:53 PM, Quincey Morris wrote:

On Apr 2, 2013, at 13:25 , Markus Spoettl ms_li...@shiftoption.com
mailto:ms_li...@shiftoption.com wrote:


I'm displaying an overlay window which is attached to the view in question.
When the rotation takes place, it needs to realign itself so that it's new
location agrees with what the view displays (in my context).


Isn't it a mistake to tie this to rotation? IIRC there are other reasons the
root view might be resized (e.g. squished to make room for the status bar or
not? notifications?). You probably want to adjust your child view location in
those cases too.

IAC you might be safer to avoid using the frame. If there's a transform involved
in the view's rotation, then the frame property will be meaningless. (But IDK if
there's actually a transform applied to the view during rotation, or whether
there's just a rotating animation.)


Not sure if I understand what you're saying, but if that was the case, the 
view's frame I'm attaching the overlay to would turn out wrong if the device is 
rotated.


The only time I get a bogus view frame is when the rotation notification is 
delivered. If I wait for the rotation to complete and get the frame then, it's 
correct (no matter which orientation the device has been rotated to). Only, it's 
useless as I have to rotate the overlay alongside the main window, so before the 
rotation is complete.


Regards
Markus
--
__
Markus Spoettl
___

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com


Re: UIView final frame after device rotation

2013-04-02 Thread Quincey Morris
On Apr 2, 2013, at 14:21 , Markus Spoettl ms_li...@shiftoption.com wrote:

 Not sure if I understand what you're saying, but if that was the case, the 
 view's frame I'm attaching the overlay to would turn out wrong if the device 
 is rotated.

No, once the rotation is complete (at least), there'd be no transform any more, 
and so the frame would then be valid.

I looked at what happens when I rotate iBooks from portrait to landscape on an 
iPad (a +90 degree rotation), and this is what I see:

1. The view changes from portrait layout to landscape layout, but is displayed 
so the text is still in portrait orientation. In other words, the view behaves 
*as if* it immediately resizes to its final landscape orientation bounds, and 
is immediately displayed with a -90 degree rotation relative to landscape 
orientation, which preserves the original text orientation.

2. The view animates the rotation to landscape.  That is, the view appears to 
animate its rotation smoothly from -90 degrees up to 0 degrees, relative to 
landscape orientation. (There may also be a scaling involved here, I couldn't 
quite tell since it all happens so fast. If there is one, it also ends at 100%.)

3. At that time, the transformation is the identity transformation.

If the rotation notification is sent after step 1, the view frame is 
meaningless until step 3.

 The only time I get a bogus view frame is when the rotation notification is 
 delivered.

It would be easy to try examining the bounds and center properties at the 
time of the notification, and see whether *they* are bogus. If not, you should 
be able to orient your child view using those two properties, instead of using 
frame.

___

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com