Округленный прямоугольник в 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]()
Как я могу это достичь?
Ответы
Ответ 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
Вы можете сделать это в построителе интерфейса без подкласса, добавив атрибуты времени выполнения, определенные пользователем
![введите описание изображения здесь]()