Iphone - Как я могу создать изображение с закругленным углом и тенью?

enter image description here

что-то вроде выше?

Я знаю, как создать округленный угол:

imageView.layer.cornerRadius = 10;
imageView.layer.shouldRasterize = YES;
imageView.layer.masksToBounds = YES;

Для тени я пробовал

imageView.layer.shadowOffset = CGSizeMake(1, 1);
imageView.layer.shadowRadius = 5;
imageView.layer.shadowOpacity = 0.4;
imageView.layer.shadowColor = [UIColor blackColor].CGColor;
imageView.layer.shouldRasterize = YES;

Но imageView.layer.masksToBounds = YES; из закругленного угла убивает тень.

Другой вопрос заключается в том, как создать тень, точно такую ​​же, как показано на изображении? Я создал этот образ в фотошопе, я использовал 120 градусов в качестве направления света. Но если бы я использовал вышеприведенный код и отключил maskToBounds, я вижу тень, и это уродливо.

Или я могу создать рамку с закругленным углом + теневое изображение в фотошопе и применить кадр к каждому изображению в своем приложении? Я думаю, что это даст лучшую производительность. затенение и поворот изображений на лету будет иметь ужасную производительность, если все изображения находятся в прокрутке.

Спасибо

Ответ 1

Попробуйте следующее:

 CALayer *sublayer = [CALayer layer];
 sublayer.backgroundColor = [UIColor blueColor].CGColor;
 sublayer.shadowOffset = CGSizeMake(0, 3);
 sublayer.shadowRadius = 5.0;
 sublayer.shadowColor = [UIColor blackColor].CGColor;
 sublayer.shadowOpacity = 0.8;
 sublayer.frame = CGRectMake(30, 30, 128, 192);
 sublayer.borderColor = [UIColor blackColor].CGColor;
 sublayer.borderWidth = 2.0;
 sublayer.cornerRadius = 10.0;
 [self.view.layer addSublayer:sublayer];

 CALayer *imageLayer = [CALayer layer];
 imageLayer.frame = sublayer.bounds;
 imageLayer.cornerRadius = 10.0;
 imageLayer.contents = (id) [UIImage imageNamed:@"BattleMapSplashScreen.jpg"].CGImage;
 imageLayer.masksToBounds = YES;
 [sublayer addSublayer:imageLayer];

И посмотрите исходный источник

Ответ 2

Я бы использовал два изображения. Фон png, который имеет тень (может быть повторно использован для каждого изображения) и переднее png-изображение с закругленными углами.

Ответ 3

Возможно, вы захотите использовать другой слой для теневого копирования и сохранить свой masksToBounds и округлять код. В этом примере imageView - это имя изображения, которое вы хотите затенять и округлить:

CALayer *shadowLayer = [[[CALayer alloc] init] autorelease];
sublayer.frame = imageView.bounds;
sublayer.masksToBounds = NO;
sublayer.shadowOffset = CGSizeMake(1, 1);
sublayer.shadowRadius = 5;
sublayer.shadowOpacity = 0.4;
sublayer.shadowColor = [UIColor blackColor].CGColor;
sublayer.shouldRasterize = YES;

[imageView.layer insertSublayer:shadowLayer atIndex:0]; // Put it underneath the image

Это должно дать вам тень. Теперь, чтобы избежать медленного пересчета, я предлагаю создать UIImage из изображения. См. Эту ссылку: Создайте UIImage из теневого вида, сохраняя альфа?.

Надеюсь, это поможет!