Нет тени, если края закруглены в NSView

Я пытаюсь округлить и отбросить тень из одного производного класса NSView со следующим кодом:

   [graphHostView setWantsLayer:YES];


    graphHostView.layer.shadowRadius = 5.0;
    graphHostView.layer.shadowOffset = NSMakeSize(10.0f, -10.0f);
    graphHostView.layer.shadowOpacity = 0.5f;


    graphHostView.layer.needsDisplayOnBoundsChange = YES;
    graphHostView.layer.masksToBounds = YES;    
    graphHostView.layer.cornerRadius = 10.0;
    [graphHostView.layer setNeedsLayout];

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

NSShadow *myShadow = [[NSShadow alloc]init]; [myShadow setShadowOffset: NSMakeSize (10.0f, -10.0f)]; [myShadow setShadowBlurRadius: 3.0]; [graphHostView setShadow: myShadow]; [набор моих теней];

с совершенно таким же эффектом. Я пробовал все комбинации отображения, setNeedsLayout и других свойств и методов, и ничего не работает.

Мне кажется невероятным, что это не работает, ведь NSWindow закруглен и затенен...

Напомню, что я должен добавить, что я пытался применить тень также к фоновому слою с тем же результатом. Поскольку masksToBounds, как ожидается, будет маскировать все, что выходит за границы, разумно предположить, что тень не может отображаться на том же слое. Также ясно, что маскирование влияет на все, что можно было бы добавить к этому слою и позже, после маскирования, так как порядок установки тени и маски не влияет на результат.

Итак, вопрос все еще в том, как добиться желаемого результата, не управляя другим NSView ниже с тенью, если это вообще возможно?


person mbpro    schedule 05.01.2012    source источник
comment
Предотвращает ли masksToBounds отрисовку вашей тени (поскольку она находится за пределами границ?)   -  person jrturton    schedule 05.01.2012
comment
Спасибо за подсказку, я обновил вопрос. :)   -  person mbpro    schedule 05.01.2012


Ответы (2)


Это сделало это для меня (в Swift):

graphHostView.layer.masksToBounds = ложь

person Alvaro Roman    schedule 30.03.2016

Тебе нужно:

[[graphHostView superview] setWantsLayer:YES];
person DaoYan.Tang    schedule 08.08.2013