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

72
9

Я пытаюсь округлить и отбросить тень из одного производного класса 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];
[myShadow set];


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


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


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


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

спросил(а) 2012-01-05T14:28:00+04:00 8 лет, 9 месяцев назад
1
Решение
58

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

graphHostView.layer.masksToBounds = false

ответил(а) 2016-03-30T18:34:00+03:00 4 года, 7 месяцев назад
-6

Вам нужно:

[[graphHostView superview] setWantsLayer:YES];

ответил(а) 2013-08-08T07:38:00+04:00 7 лет, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема