75 votes

Quelle est la meilleure façon de créer une ombre derrière un UIImageView ?

J'ai une UIImageView à laquelle je veux ajouter une ombre. J'aimerais qu'apple ait cette propriété, mais ils doivent rendre beaucoup de choses difficiles pour nous, programmeurs, alors je dois poser cette question.

1 votes

Il est probable que vous souhaitiez utiliser les fonctions de dessin du Core Graphics pour dessiner l'ombre.

0 votes

217voto

Alex Nguyen Points 1521

Il existe un moyen plus simple et plus efficace de le faire. UIImageView hérite de UIView et possède donc une propriété de couche. Vous pouvez accéder aux propriétés de l'ombre du calque et bam, vous avez une ombre.

Si vous avez l'UIImageView comme IBOutlet vers un fichier nib, vous pouvez simplement implémenter la fonction awakeFromNib. par exemple.

Objectif-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;
}

N'oubliez pas de #import "QuartzCore/CALayer.h"


Pour Swift, vous pouvez vous y prendre de plusieurs manières. Créer une extension de classe, une sous-classe ou une instance d'imageView. Quelle que soit la manière, le processus est le même pour modifier la propriété d'ombre des couches.

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
}

32 votes

Vous pouvez également avoir besoin imageView.clipsToBounds = NO; ou l'ombre sera coupée.

18 votes

Vous devrez également #importer "QuartzCore/CALayer.h"

1 votes

@MaxHowell L'utilisation de clipsToBounds a permis d'ajouter l'ombre, mais maintenant mon image déborde également de ses limites lorsque j'utilise le mode "Aspect Fill". Existe-t-il un moyen de couper l'image mais pas l'ombre ?

11voto

Ben Gottlieb Points 59900

La chose la plus simple à faire est d'ajouter un calque d'ombre à votre vue d'image :

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];

Assurez-vous que l'option "Clip Subviews" est désactivée pour la vue.

1 votes

Pourquoi créez-vous un CGRect *bounds alors que vous pouvez simplement définir les limites du calque sur self.bounds ? Et où se situe l'ombre ?

0 votes

Je crée une variable temporaire pour la lisibilité ; taper self.bounds est un peu plus long que juste bounds, et rend le code un peu moins lisible. Cette couche EST l'ombre. Bien sûr, cela présuppose que vous avez une image carrée ; si vous avez une image non rectangulaire, vous devrez utiliser un masque d'image personnalisé.

0 votes

Je veux le faire décolorer et je ne sais pas comment faire. Aidez-moi, s'il vous plaît !

9voto

Boris Y. Points 1247

Solution rapide avec extension. La sous-classification n'est pas nécessaire. Appelez myImage.addShadow() de viewDidLoad() . Cela devrait fonctionner pour UIView y 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
    }
}

5voto

mturhan55 Points 141

En plus de cela, si vous voulez faire une bordure blanche et une ombre, vous pouvez utiliser ce code :

//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 votes

Mais dans ce cas, comment faire pour que l'ombre fasse partie de la propriété .image, pour, disons, enregistrer ou afficher cette image ailleurs ?

0 votes

Tu ne peux pas. Vous ne modifiez pas l'image, vous l'embellissez pour l'afficher. Modifier les données bitmap, c'est beaucoup plus compliqué. Envisagez de simplement orner l'image partout où vous l'affichez, car vous ne souhaitez généralement pas traiter les images pour ajouter ce genre d'effets, à moins de le faire dans un back-end qui les traite par lots.

0voto

mrhevor Points 18

Swift 5.x

profileImageView.layer.cornerRadius = profileImageView.frame.size.width/2
profileImageView.clipsToBounds = false
profileImageView.layer.shadowColor = UIColor.black.cgColor
profileImageView.layer.shadowOpacity = 0.7
profileImageView.layer.shadowOffset =  CGSize(width: 2, height: 2)
profileImageView.layer.shadowRadius = 10

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X