Search code examples
objective-cnsviewselfbounds

Actual size of NSView Self


I just started a brandnew project GrafLaboratory to do some experimenting on drawing in NSView. I added a custom view to the main window and configured it to adopt it´s size when the window changes it´s size.

I modified my InitFrameWith to this:

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        NSRect r = [self bounds];
    }

    return self;
}

When I start my new app the first time and ask for [self bounds] I get the correct value: {{0, 50}, {600, 450}}. I then change the size of the window by dragging with the mouse. When restarting my app initWithFrame returns the same value: {{0, 50}, {600, 450}}.

But I the new changed size. I already tried several things but without success.

Any clues what I´m doing wrong?

Thanks, Ronald


Solution

  • The initWithFrame is only relevant when you initialize the object within a frame.

    If it's a custom UIView with custom drawing, then look at:

    - (void)drawRect:(NSRect)frame
    

    That will get called when setNeedsDisplay is called and/or the view is resized.

    With some custom views, one thing I've done in initWithFrame is to set the autoresize masks:

        // subviews autoresize
        [self setAutoresizesSubviews:YES];   
        // set resize masks (springs)
        [self setAutoresizingMask:(NSViewMaxXMargin | NSViewMinXMargin |
                                  NSViewMaxYMargin | NSViewMinYMargin |
                                  NSViewHeightSizable | NSViewWidthSizable)];
    

    Then in both init and drawRect, I call my layoutViews metod if the rect has changed:

    - (void)drawRect:(NSRect)frame {
        ...
        // called on resize.  on init, delegate isn't hooked up so we'll skip
        if (!NSEqualRects(_prevRect, [self bounds]))
        {
            [self layoutViews];
        }
    
        // stash away rect for comparison so layout view code only happens when the rect changes
        _prevRect = [self bounds];
    

    My layoutViews has custom layout logic.

    Hope that helps.