118 votes

Ajout d'un coin arrondi et d'une ombre portée à UICollectionViewCell

J'ai déjà parcouru plusieurs articles sur l'ajout d'une deuxième vue pour l'ajout d'une ombre, mais je ne parviens toujours pas à la faire fonctionner si je veux l'ajouter. UICollectionViewCell . J'ai sous-classé UICollectionViewCell Voici mon code où j'ajoute divers éléments d'interface utilisateur à la vue du contenu de la cellule et où j'ajoute une ombre à la couche :

[self.contentView setBackgroundColor:[UIColor whiteColor]];

self.layer.masksToBounds = NO;
self.layer.shadowOffset = CGSizeMake(0, 1);
self.layer.shadowRadius = 1.0;
self.layer.shadowColor = [UIColor blackColor].CGColor;
self.layer.shadowOpacity = 0.5;
[self.layer setShadowPath:[[UIBezierPath bezierPathWithRect:self.bounds] CGPath]];

J'aimerais savoir comment ajouter un coin arrondi et une ombre à l'image de l'entreprise. UICollectionViewCell .

208voto

Mike Sabatini Points 2521

Aucune de ces solutions n'a fonctionné pour moi. Si vous placez toutes vos vues secondaires dans la vue de contenu UICollectionViewCell, ce qui est probablement le cas, vous pouvez définir l'ombre sur le calque de la cellule et la bordure sur le calque de la vue de contenu pour obtenir les deux résultats.

cell.contentView.layer.cornerRadius = 2.0f;
cell.contentView.layer.borderWidth = 1.0f;
cell.contentView.layer.borderColor = [UIColor clearColor].CGColor;
cell.contentView.layer.masksToBounds = YES;

cell.layer.shadowColor = [UIColor blackColor].CGColor;
cell.layer.shadowOffset = CGSizeMake(0, 2.0f);
cell.layer.shadowRadius = 2.0f;
cell.layer.shadowOpacity = 0.5f;
cell.layer.masksToBounds = NO;
cell.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:cell.bounds cornerRadius:cell.contentView.layer.cornerRadius].CGPath;

Swift 3.0

self.contentView.layer.cornerRadius = 2.0
self.contentView.layer.borderWidth = 1.0
self.contentView.layer.borderColor = UIColor.clear.cgColor
self.contentView.layer.masksToBounds = true

self.layer.shadowColor = UIColor.black.cgColor
self.layer.shadowOffset = CGSize(width: 0, height: 2.0)
self.layer.shadowRadius = 2.0
self.layer.shadowOpacity = 0.5
self.layer.masksToBounds = false
self.layer.shadowPath = UIBezierPath(roundedRect: self.bounds, cornerRadius: self.contentView.layer.cornerRadius).cgPath

35voto

Torre Lasley Points 492

Version Swift 3 :

cell.contentView.layer.cornerRadius = 10
cell.contentView.layer.borderWidth = 1.0

cell.contentView.layer.borderColor = UIColor.clear.cgColor
cell.contentView.layer.masksToBounds = true

cell.layer.shadowColor = UIColor.gray.cgColor
cell.layer.shadowOffset = CGSize(width: 0, height: 2.0)
cell.layer.shadowRadius = 2.0
cell.layer.shadowOpacity = 1.0
cell.layer.masksToBounds = false
cell.layer.shadowPath = UIBezierPath(roundedRect:cell.bounds, cornerRadius:cell.contentView.layer.cornerRadius).cgPath

27voto

rocket101 Points 540

Au cas où ça aiderait : Voici le martinet pour arrondir les angles :

cell.layer.cornerRadius = 10
cell.layer.masksToBounds = true

avec cell étant une variable contrôlant la cellule : souvent, vous l'utiliserez en override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell

Profitez-en !

22voto

Massimo Polimeni Points 2718

Ici, le Swift 4 solution, mise à jour en rond chaque et pas seulement les coins supérieurs :

contentView.layer.cornerRadius = 6.0
contentView.layer.borderWidth = 1.0
contentView.layer.borderColor = UIColor.clear.cgColor
contentView.layer.masksToBounds = true

layer.shadowColor = UIColor.lightGray.cgColor
layer.shadowOffset = CGSize(width: 0, height: 2.0)
layer.shadowRadius = 6.0
layer.shadowOpacity = 1.0
layer.masksToBounds = false
layer.shadowPath = UIBezierPath(roundedRect: bounds, cornerRadius: contentView.layer.cornerRadius).cgPath
layer.backgroundColor = UIColor.clear.cgColor

21voto

cocoanut Points 2396

Voici ma réponse, proche des autres, mais j'ajoute un rayon d'angle au calque sinon les angles ne se rempliront pas correctement. De plus, cela fait une belle petite extension sur UICollectionViewCell .

extension UICollectionViewCell {
    func shadowDecorate() {
        let radius: CGFloat = 10
        contentView.layer.cornerRadius = radius
        contentView.layer.borderWidth = 1
        contentView.layer.borderColor = UIColor.clear.cgColor
        contentView.layer.masksToBounds = true

        layer.shadowColor = UIColor.black.cgColor
        layer.shadowOffset = CGSize(width: 0, height: 1.0)
        layer.shadowRadius = 2.0
        layer.shadowOpacity = 0.5
        layer.masksToBounds = false
        layer.shadowPath = UIBezierPath(roundedRect: bounds, cornerRadius: radius).cgPath
        layer.cornerRadius = radius
    }
}

Vous pouvez l'appeler dans collectionView(_:cellForItemAt:) de la source de données une fois que vous avez déqueue votre cellule.

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