Подтвердить что ты не робот

Округленный прямоугольник в NSView, который закрепил все содержащиеся в нем объекты

Я создаю подкласс NSView, который имеет закругленные углы. Это представление предназначено для контейнера, и к нему будут добавлены другие подпункты. Я пытаюсь получить закругленные углы NSView, чтобы обрезать все углы subview, но не могу его получить.

- (void)drawRect:(NSRect)dirtyRect {
    NSRect rect = [self bounds];
    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:rect xRadius:self.radius yRadius:self.radius];
    [path addClip];

    [[NSColor redColor] set];
    NSRectFill(dirtyRect);

    [super drawRect:dirtyRect];     
}

Красный, например, красный. Если я добавлю subview в rect, углы не обрезаются: enter image description here

Как я могу это достичь?

4b9b3361

Ответ 1

Вы пробовали обрезать слои?

self.layer.cornerRadius = self.radius; self.layer.masksToBounds = YES; Забастовкa >


Ах, извините, я почему-то пропустил, что вы говорили о NSView, а не UIView. Во всех случаях было бы сложно закрепить подвид NSView во всех случаях, потому что кажется, что большинство стандартных представлений Cocoa устанавливают свой собственный путь обрезки. Возможно, было бы проще размещать подпункты с некоторыми прокладками и избегать необходимости отсечения.

Ответ 2

Использование слоев Core Animation будет правильно закреплять подслои.

В подклассе NSView контейнера:

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.layer = _layer;   // strangely necessary
        self.wantsLayer = YES;
        self.layer.masksToBounds = YES;    
        self.layer.cornerRadius = 10.0;    
    }    
    return self;
}

Ответ 3

Вы можете сделать это в построителе интерфейса без подкласса, добавив атрибуты времени выполнения, определенные пользователем

введите описание изображения здесь