Закругленный прямоугольник на NSView, который обрезает все содержащие подпредставления - PullRequest
14 голосов
/ 23 февраля 2011

Я создаю 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];     
}

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

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

Ответы [ 3 ]

30 голосов
/ 06 октября 2011

Использование слоев 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;
}
15 голосов
/ 06 декабря 2016

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

enter image description here

0 голосов
/ 23 февраля 2011

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

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


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

...