2016-02-22 3 views
0

У меня есть мнение 30x30 округленной:CALayer cornerRadius + masksToBounds 10.11 сбой?

CALayer * layer = self.layer; 
layer.backgroundColor = [NSColor redColor].CGColor; 
layer.cornerRadius = 10.0f; 
layer.masksToBounds = YES; 

До сих пор так хорошо: enter image description here

Затем добавить подслой, например, так:

CALayer * subLayer = [CALayer layer]; 
subLayer.backgroundColor = [NSColor yellowColor].CGColor; 
subLayer.frame = CGRectMake(0.0f, 0.0f, 10.0f, 10.0f); 
[layer addSublayer:subLayer]; 

И я в конечном итоге это, чего я не хочу! enter image description here

Это проблема, которая появилась только после моего обновления до El Capitan. В Yosemite маскировка работала над вышеуказанным кодом. Что мне не хватает?

Обновление: эта проблема не возникает, когда я устанавливаю layer.shouldRasterize = YES;, однако я хочу сохранить память, поэтому я предпочел бы другое решение.

ответ

0

Я нашел свое собственное решение, используя форму слой + маску вместо cornerRadius:

CALayer * layer = self.layer; 
layer.backgroundColor = [NSColor redColor].CGColor; 
// 
// code to replace layer.cornerRadius: 
CAShapeLayer * shapeLayer = [CAShapeLayer layer]; 
float const r = 10.0f; 
float const w = self.bounds.size.width; 
float const h = self.bounds.size.height; 
CGMutablePathRef path = CGPathCreateMutable(); 
CGPathMoveToPoint(path, NULL, r, 0.0f); 
CGPathAddArcToPoint(path, NULL, w, 0.0f, w, r, r); 
CGPathAddArcToPoint(path, NULL, w, h, w - r, h, r); 
CGPathAddArcToPoint(path, NULL, 0.0f, h, 0.0f, h - r, r); 
CGPathAddArcToPoint(path, NULL, 0.0f, 0.0f, r, 0.0f, r); 
CGPathCloseSubpath (path); 
shapeLayer.path = path; 
CGPathRelease(path); 
self.layer.mask = shapeLayer; 
// 
// add the sublayer 
CALayer * subLayer = [CALayer layer]; 
subLayer.backgroundColor = [NSColor yellowColor].CGColor; 
subLayer.frame = CGRectMake(0.0f, 0.0f, 10.0f, 10.0f); 
[layer addSublayer:subLayer]; 

работает, как предполагалось: enter image description here

(Конечно, если кто-то более элегантное исправление, Я бы хотел это увидеть!)

Смежные вопросы