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

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

- (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];     
}

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

Как мне этого добиться?

3 ответа

Решение

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

self.layer.cornerRadius = self.radius; self.layer.masksToBounds = YES;


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

Использование слоев 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;
}

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

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

Другие вопросы по тегам