Да, да, есть ...
Если вам нужны и угловой радиус, и тень, вы не включаете -masksToBounds , а устанавливаете угловой радиуси установите безье путь тени с закругленным прямоугольником.Держите радиус обоих одинаковым:
[layer setShadowOffset:CGSizeMake(0, 3)];
[layer setShadowOpacity:0.4];
[layer setShadowRadius:3.0f];
[layer setShouldRasterize:YES];
[layer setCornerRadius:12.0f];
[layer setShadowPath:
[[UIBezierPath bezierPathWithRoundedRect:[self bounds]
cornerRadius:12.0f] CGPath]];
Возможно, вы захотите проверить свою производительность без набора параметра -shouldRasterize , как только вы установите путь тени.Производительность рисования имеет тенденцию быть очень хорошей, если вы задали путь тени.
ОБНОВЛЕНИЕ
Я не рассматривал эту проблему довольно давно, но, похоже,что вам больше не нужно устанавливать shadowPath
, чтобы заставить это работать.Простая установка cornerRadius
и shadowOpacity
будет работать сейчас.Я думаю, что это имело место с iOS5 (насколько я могу судить).Предоставление этого обновления, вероятно, не является необходимым, поскольку установка этих параметров «просто работает», но я предоставлю это для потомков.Напомним, что теперь это все, что вам нужно:
[layer setShadowOpacity:0.4];
[layer setCornerRadius:12.0f];
Если вам все еще нужна лучшая производительность, вы можете также установить параметр shouldRasterize
:
[layer setShouldRasterize:YES];
ИГоворя о производительности, стоит отметить, что если вы замечаете вялую анимацию, вам все-таки захочется использовать технику установки пути тени.Это обновление действительно было просто для того, чтобы указать, что установка пути больше не требуется для достижения эффекта одновременного отображения углового радиуса и тени.Если производительность является вашим приоритетом, используйте путь.
ОБНОВЛЕНИЕ 2
Поскольку у людей, похоже, возникают проблемы с тем, чтобы заставить это работать в некоторых случаях, я будуопубликуйте более полный фрагмент кода здесь из примера проекта, который я создал:
- (void)viewDidLoad
{
[super viewDidLoad];
CALayer *layer = [CALayer layer];
[layer setBounds:CGRectMake(0.0f, 0.0f, 100.0f, 200.0f)];
[layer setPosition:[[self view] center]];
[layer setBackgroundColor:[[UIColor lightGrayColor] CGColor]];
[layer setShadowOpacity:0.55f];
[layer setCornerRadius:8.0f];
[layer setBorderWidth:1.0f];
[[[self view] layer] addSublayer:layer];
[[[self testView] layer] setShadowOpacity:0.55f];
[[[self testView] layer] setShadowRadius:15.0f];
[[[self testView] layer] setCornerRadius:8.0f];
[[[self testView] layer] setBorderWidth:1.0f];
}
testView
- это UIView, который я добавил в Interface Builder и включил выход.Это сделано для того, чтобы убедиться, что он работает одинаково на обоих слоях, которые вы добавляете явно, а также на слоях в подпредставлениях.
Я проверял это на симуляторах для iOS5 - iOS6.1.Это дает мне результат в каждом из них: