Подвид пользовательского NSView изменяет размеры, чтобы вписаться в его суперпредставление - PullRequest
1 голос
/ 22 марта 2010

У меня есть собственный NSView, который содержит подпредставление - для решения этой проблемы представление верхнего уровня просто действует как контейнер и автоматически изменяет размеры, чтобы поместиться в окне. Его подпредставление рисует прямоугольник со вставкой в ​​10 пикселей от края окна, за исключением нижней части, которая должна обрезаться окном до тех пор, пока не будет изменен размер для отображения всего прямоугольника. Однако он не ведет себя так, как я намереваюсь, а вместо этого уменьшает высоту прямоугольника, когда его суперпредставление имеет меньшую высоту, чем оно. Как мне избежать этого, чтобы он оставался на своей правильной высоте и вместо этого был обрезан, когда суперпредставление меньше?

Код реализации родительского представления:

- (id)initWithFrame:(NSRect)frameRect {
    self = [super initWithFrame:frameRect];
    if (self) {
        subView = [[SubView alloc] initWithFrame:frameRect];
    }
    return self;
}

- (void)drawRect:(NSRect)dirtyRect {
    [[NSColor grayColor] set];
    [subView setFrame:NSMakeRect(10, 10, dirtyRect.size.width - 20, 500)];
    [self addSubview:subView];
}

- (BOOL)isFlipped {
    return YES;
}

И подпредставление просто:

- (void)drawRect:(NSRect)dirtyRect {
    [[NSColor blackColor] set];
    [NSBezierPath strokeRect:dirtyRect];
}

- (BOOL)isFlipped {
    return YES;
}

Ответы [ 2 ]

2 голосов
/ 22 марта 2010

Как указал ericgorr , autoResizingMask должен решить проблему изменения размера.

Однако я заметил, что вы добавляете свое подпредставление в drawRect, что не место для этого. drawRect вызывается много раз в течение жизни вашей программы, но addSubview: нужно только (и только должно быть) вызываться один раз, например:

- (id)initWithFrame:(NSRect)frameRect {
    self = [super initWithFrame:frameRect];
    if (self) {
        subView = [[SubView alloc] initWithFrame:frameRect];
        [self addSubview:subView]; // this view now owns subView ...
        [subView release];         // ... so we can release our copy
    }
    return self; 
} 

- (void)drawRect:(NSRect)dirtyRect { 
    [[NSColor grayColor] set]; 
    [subView setFrame:NSMakeRect(10, 10, [self bounds].size.width - 20, 500)];
} 

Обратите внимание также на использование [self bounds] вместо dirtyRect. dirtyRect - это прямоугольник, описывающий регион, который необходимо перерисовать. Это не всегда будет весь ограничивающий прямоугольник вашего представления. [self bounds], с другой стороны, всегда будет представлять все границы вашего представления, независимо от того, какая часть перерисовывается.

2 голосов
/ 22 марта 2010

Скорее всего, ваше подпредставление имеет маску авторазмера. Вы можете очистить это, вызвав -setAutoresizingMask: с NSViewNotSizable.

Если суперпредставление не должно изменять размеры какого-либо из его подпредставлений, вы можете использовать -setAutoresizesSubviews:

...