Re: Removing/Adding views in drawRect:
Re: Removing/Adding views in drawRect:
- Subject: Re: Removing/Adding views in drawRect:
- From: "Mike R. Manzano" <email@hidden>
- Date: Thu, 31 Aug 2006 11:05:54 -0700
Hi all,
Thanks for the replies thus far. I suppose I wasn't specific enough
with my question. Here's what seems to be fouling up my app:
(1) I start resizing my window.
(2) The window resize causes NSTextViews to resize in response.
(3) This forces the text within the text views to do a re-layout.
(4) In response to the re-layout, my delegates add/remove NSTextViews
to accommodate the new text layout.
It seems that somewhere in here things are getting all fouled up. The
NSTextViews don't render properly. Is what I'm doing bad?
I seemed to have gotten around this problem by:
(A) Having the subview that arranges the view not pay attention to
frame resizes, but instead a special notification that I post myself.
(2) Posting this special notification in the parent view's
viewDidEndLiveResize, and also in my window's zoom:.
(iii) For whatever reasons, views still seemed to get fouled up
until, in my layoutManager:didCompleteLayoutForTextContainer:atEnd:
delegate method, I deferred my NSTextView addition/removal thusly:
// [ self appendOneTextView ] ;
[ self performSelector:@selector( appendOneTextView )
withObject:nil afterDelay:0.0f ] ;
This seems to workn consistently, but:
(x) (obviously) live resize is now ugly, because my views don't
refresh until AFTER the live resize is finished
(x+1) I have no clue why I had to defer appendOneTextView, which
makes me uneasy.
I hope that wasn't too detailed. Any thoughts?
~ Mike
alephx01 (at) mac (dot) com
On Aug 30, 2006, at 9:58 PM, Andrew Merenbach wrote:
Hi, Mike. In regard to (2), you may wish to do something like (in
accordance with Uli's suggestion) in the class that handles the
adding and removing of subviews:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(addOrRemoveSubviewsDuringResize:)
name:NSWindowDidResizeNotification object:myWindow];
This will cause -addOrRemoveSubviewsDuringResize: to be called
whenever the pixel dimensions of myWindow change. Change the
observer if you need a different object to handle the adding or
removing of subviews.
Cheers,
Andrew
On Aug 30, 2006, at 1:56 PM, Uli Kusterer wrote:
Am 30.08.2006 um 20:40 schrieb Mike R. Manzano:
(1) Is it prudent to add or remove subviews in drawRect:?
No. Moving views can cause a view to be invalidated, which would
cause drawRect: to be called again. If you search the list
archives you'll se epostings from lots of people who did it anyway
and got hilarious endless loops, dropped updates and other odd
behaviour.
If not,
(2) Is it prudent to add or remove views somewhere else during a
window live resize?
I think there's a notification sent when auto-resizing happens.
Alternatively, you could just override that method (don't remember
the name, but a quick read of NSView.h should make it obvious)
that's called when a superview is resized and asked to resize its
subviews. That should be a safe place to show/hide subviews before
calling through to super.
Cheers,
-- M. Uli Kusterer
http://www.zathras.de
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Cocoa-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
40ucla.edu
This email sent to email@hidden
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Cocoa-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden