2010-01-11 2 views
64

У меня есть UIImageView, что я хочу добавить тень позади. Я хочу, чтобы у яблока было это свойство, но нам нужно много сделать для программистов, поэтому мне нужно задать этот вопрос.Каков наилучший способ создать тень за UIImageView

+1

Скорее всего, вы хотите использовать функции рисования сердечника для рисования тени. –

+0

Эти вопросы очень похожи на ваши: http://stackoverflow.com/questions/962827/uiimage-shadow, http://stackoverflow.com/questions/1943087/i-am-trying-to-add-a-drop -shadow-to-a-uimageview –

ответ

195

Там это лучше и проще сделать это. UIImageView наследует UIView, поэтому он обладает свойством layer. Вы можете получить доступ к свойствам тени тени и bam, у вас есть тень.

Если у вас есть UIImageView как IBOutlet для файла nib, вы можете просто реализовать awakeFromNib , например.

Objective-C

- (void)awakeFromNib { 
    imageView.layer.shadowColor = [UIColor purpleColor].CGColor; 
    imageView.layer.shadowOffset = CGSizeMake(0, 1); 
    imageView.layer.shadowOpacity = 1; 
    imageView.layer.shadowRadius = 1.0; 
    imageView.clipsToBounds = NO; 
} 

Не забудьте #import "QuartzCore/CALayer.h"


Для Swift, вы можете это сделать несколькими способами. Создайте расширение класса, подкласс или экземпляр imageView. Какой бы ни был способ, процесс тот же, что и при изменении свойства теневого слоя.

Swift 3

override func awakeFromNib() { 
    super.awakeFromNib() 

    imageView.layer.shadowColor = UIColor.purple.cgColor 
    imageView.layer.shadowOffset = CGSize(width: 0, height: 1) 
    imageView.layer.shadowOpacity = 1 
    imageView.layer.shadowRadius = 1.0 
    imageView.clipsToBounds = false 
} 
+27

Вам также может понадобиться «imageView.clipsToBounds = NO;» или тень будет отсечена. – mxcl

+0

да, вы правы. не забывайте об этом! –

+18

вам также нужно будет #import «QuartzCore/CALayer.h» – dev

10

Самое простое, что нужно сделать, это добавить тень слоя на ваш взгляд изображения:

CALayer    *layer = [CALayer layer]; 
CGRect    bounds = self.bounds; 

layer.bounds = bounds; 
layer.position = CGPointMake(bounds.size.width/2 + 3, bounds.size.height/2 + 3); 
layer.backgroundColor = [UIColor colorWithWhite: 0.25 alpha: 0.55].CGColor; 
layer.zPosition = -5; 

[self.layer addSublayer: layer]; 

Убедитесь, что «Клип подвиды» выключен для зрения

+1

Почему вы делаете ограничения CGRect *, когда вы можете просто установить границы слоя на self.bounds? И где тень появляется на месте? – Jaba

+0

Я создаю временную переменную для удобочитаемости; типизация self.bounds немного длиннее, чем просто границы, и делает код немного менее удобочитаемым. Этот слой - это тень. Конечно, это предполагает, что у вас есть квадратное изображение; если вы делаете непрямоугольный образ, вам придется использовать настраиваемую маску изображения. –

+0

Ну, я хочу, чтобы он исчез, и я не знаю, как бы я это сделал. Просьба помочь! – Jaba

4

в дополнение к этому, если вы хотите, чтобы сделать белую рамку и тени вы можете использовать этот код:

//shadow part 
imageView.layer.shadowColor = [UIColor blackColor].CGColor; 
imageView.layer.shadowOffset = CGSizeMake(0, 1); 
imageView.layer.shadowOpacity = 1; 
imageView.layer.shadowRadius = 1.0; 
//white border part 
[imageView.layer setBorderColor: [[UIColor whiteColor] CGColor]]; 
[imageView.layer setBorderWidth: 2.0]; 
+0

Но в этом случае, как сделать теневую часть свойства .image, скажем, сохранить или показать это изображение где-то еще? – alejandrormz

+0

Вы не можете. Вы не редактируете изображение, вы его украшаете для отображения. Фактически редактировать растровые данные намного сложнее. Подумайте, просто украшая изображение везде, где вы его показываете, поскольку вы вообще не хотите обрабатывать изображения, чтобы добавлять такие эффекты, если только вы не делаете этого в задней части, которая обрабатывает их партиями. – Tim

-2

UIView набор shadowlayer

и addSubview: ваше изображениеView

+0

Можете ли вы рассказать об этом? Благодаря! –

4

Быстрое решение с расширением. Подкласс не требуется. Позвоните myImage.addShadow() от viewDidLoad(). Это должно работать для UIView и UIImageView.

extension UIView { 

    func addShadow() { 
     layer.shadowColor = UIColor.black.cgColor 
     layer.shadowOffset = CGSize(width: 0, height: 0) 
     layer.shadowOpacity = 0.5 
     layer.shadowRadius = 5 
     clipsToBounds = false 
    } 
}