Re: Scrollers on custom view appearing but not disappearing
Re: Scrollers on custom view appearing but not disappearing
- Subject: Re: Scrollers on custom view appearing but not disappearing
- From: Steve Weller <email@hidden>
- Date: Fri, 29 Feb 2008 21:31:56 -0800
On Feb 29, 2008, at 4:00 PM, Steve Weller wrote:
I have a custom view into which I can draw a background color and a
centered rectangle. As the window is resized, the rectangle stays
centered and is clipped when the window gets small.
I want to define a canvas size slightly bigger than the rectangle
and have the scrollers appear when the available space is less than
the canvas needs. I override setFrameSize to do this:
- (void) setFrameSize:(NSSize)newSize
{
NSSize cSize;
cSize = [self canvasSize]; // Provides a size
// Use the larger dimensions of the two rects
if(newSize.width > cSize.width)
cSize.width = newSize.width;
if(newSize.height > cSize.height)
cSize.height = newSize.height;
[super setFrameSize:cSize];
}
And this works as long as the window is only made smaller. If the
window is made larger then the scrollers do not disappear.
Is my approach the right one for what I am trying to achieve?
If it is, how can I fix the scroller problem?
I figured it out. Key to my confusion was that I was not involving the
superview in the calculation.
In my -awakeFromNib I put this code:
// Receive notifications if the frame changes
[self setPostsBoundsChangedNotifications: YES];
NSNotificationCenter *center = [NSNotificationCenter defaultCenter] ;
[center addObserver: self
selector: @selector(frameDidChangeNotification:)
name: NSViewFrameDidChangeNotification
object: self];
NSSize cSize;
cSize = [self canvasSize];
[self setFrame:NSMakeRect(0,0,cSize.width,cSize.height)];
and I added
// The frame has changed
-(void)frameDidChangeNotification:(NSNotification *)notification
{
[[NSNotificationCenter defaultCenter] removeObserver: self];
NSRect frame = [[self superview] frame];
NSSize cSize;
cSize = [self canvasSize];
// Use the larger dimensions of the canvas and the superview
if(frame.size.width > cSize.width)
cSize.width = frame.size.width;
if(frame.size.height > cSize.height)
cSize.height = frame.size.height;
[self
setFrame:NSMakeRect
(frame.origin.x,frame.origin.y,cSize.width,cSize.height)];
// NSLog(@"%f %f",newSize.width, newSize.height);
NSNotificationCenter *center = [NSNotificationCenter defaultCenter] ;
[center addObserver: self
selector: @selector(frameDidChangeNotification:)
name: NSViewFrameDidChangeNotification
object: self];
}
This figures out the rectangle that encloses both the canvas and the
superview's frame and makes my custom view's frame equal to that. The
only remaining thing to fix is that the lower left point is always
shown in the view, when I actually want the center point to be shown.
So I have to shift the frame origin as part of the calculation.
_______________________________________________
Cocoa-dev mailing list (email@hidden)
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:
This email sent to email@hidden