将圆角和阴影添加到UICollectionViewCell

Vin*_*Yiu 86 iphone ios uicollectionviewcell

所以我已经通过添加第二个视图添加阴影的各种帖子,但如果我想添加它,我仍然无法使其工作UICollectionViewCell.我是子类UICollectionViewCell,这是我的代码,我在单元格的内容视图中添加各种UI元素并向图层添加阴影:

[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]];
Run Code Online (Sandbox Code Playgroud)

我想知道如何添加圆角和阴影UICollectionViewCell.

Mik*_*ini 177

这些解决方案都不适合我.如果将所有子视图放入UICollectionViewCell内容视图(可能是您),则可以在单元格图层上设置阴影,在contentView图层上设置边框以实现两种结果.

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;
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 添加`cell.layer.backgroundColor = [UIColor clearColor] .CGColor后,这对我来说效果很好. (8认同)
  • 我发现这绕着我的顶角,而不是我的底角. (5认同)
  • 知道为什么这仅能使我圆满完成吗? (2认同)
  • 当您选择/取消选择/移动单元格时,如何使角保持圆形?在它最初正确绘制后,只要我在细胞上呼吸,我的角落就会变直。 (2认同)

Tor*_*ley 29

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
Run Code Online (Sandbox Code Playgroud)


roc*_*101 23

如果它有帮助:这是圆角的快速:

cell.layer.cornerRadius = 10
cell.layer.masksToBounds = true
Run Code Online (Sandbox Code Playgroud)

细胞是控制细胞的变量:通常,你会使用它 override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell

请享用!


smi*_*Bot 20

这是我的答案,与其他答案接近,但我向图层添加了一个角半径,否则角将无法正确填充。此外,这对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
    }
}
Run Code Online (Sandbox Code Playgroud)

collectionView(_:cellForItemAt:)一旦您的单元出列,您就可以在数据源中调用它。


小智 14

不设置layer单元格的属性contentView.

CALayer * layer = [cell layer];
[layer setShadowOffset:CGSizeMake(0, 2)];
[layer setShadowRadius:1.0];
[layer setShadowColor:[UIColor redColor].CGColor] ;
[layer setShadowOpacity:0.5]; 
[layer setShadowPath:[[UIBezierPath bezierPathWithRect:cell.bounds] CGPath]];
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说似乎不起作用.我对uitableviewcell使用类似的代码,但它似乎不适用于collectionviewcell.奇怪的是,相同的代码在cv单元格中不起作用. (2认同)

Mas*_*eni 12

这里的Swift 4解决方案更新为围绕每个角落而不仅仅是顶角:

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
Run Code Online (Sandbox Code Playgroud)

  • 我正在寻找解决方案...感谢年轻的马西莫 :'D (4认同)

Ale*_*der 10

SWIFT 4.2

应该将其添加到您的自定义单元格或cellForItemAt:如果使用cellForItemAt:方法替代self-> cell

        self.layer.cornerRadius = 10
        self.layer.borderWidth = 1.0
        self.layer.borderColor = UIColor.lightGray.cgColor

        self.layer.backgroundColor = UIColor.white.cgColor
        self.layer.shadowColor = UIColor.gray.cgColor
        self.layer.shadowOffset = CGSize(width: 2.0, height: 4.0)
        self.layer.shadowRadius = 2.0
        self.layer.shadowOpacity = 1.0
        self.layer.masksToBounds = false
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个带有圆形边框和阴影的单元格。


Tim*_*ose 8

您只需要(a)设置cornerRadius和(b)设置shadowPath为圆角矩形,半径相同cornerRadius:

self.layer.cornerRadius = 10;
self.layer.shadowPath = [[UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:self.layer.cornerRadius] CGPath];
Run Code Online (Sandbox Code Playgroud)

  • 知道为什么这只会绕过我的底角吗? (2认同)

Ada*_*dam 7

这是我对解决方案的看法。它与其他答案类似,但有一个关键区别。它不会创建依赖于视图边界的路径。每当您根据边界创建路径并将其提供给图层时,您都可能在调整大小时遇到​​问题,并且需要设置方法来更新路径。

一个更简单的解决方案是避免使用任何依赖于边界的东西。

let radius: CGFloat = 10

self.contentView.layer.cornerRadius = radius
// Always mask the inside view
self.contentView.layer.masksToBounds = true

self.layer.shadowColor = UIColor.black.cgColor
self.layer.shadowOffset = CGSize(width: 0, height: 1.0)
self.layer.shadowRadius = 3.0
self.layer.shadowOpacity = 0.5
// Never mask the shadow as it falls outside the view
self.layer.masksToBounds = false

// Matching the contentView radius here will keep the shadow
// in sync with the contentView's rounded shape
self.layer.cornerRadius = radius
Run Code Online (Sandbox Code Playgroud)

现在,当单元格大小改变时,视图 API 将在内部完成所有工作。


Kei*_*day 6

我不得不为Swift做一些小改动:

cell.contentView.layer.cornerRadius = 2.0;
cell.contentView.layer.borderWidth = 1.0;
cell.contentView.layer.borderColor = UIColor.clearColor().CGColor;
cell.contentView.layer.masksToBounds = true;

cell.layer.shadowColor = UIColor.grayColor().CGColor;
cell.layer.shadowOffset = CGSizeMake(0, 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;
Run Code Online (Sandbox Code Playgroud)


mar*_*oum 5

我使用以下方法来完成这种效果:

extension UICollectionViewCell {
    /// Call this method from `prepareForReuse`, because the cell needs to be already rendered (and have a size) in order for this to work
    func shadowDecorate(radius: CGFloat = 8,
                        shadowColor: UIColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.3),
                        shadowOffset: CGSize = CGSize(width: 0, height: 1.0),
                        shadowRadius: CGFloat = 3,
                        shadowOpacity: Float = 1) {
        contentView.layer.cornerRadius = radius
        contentView.layer.borderWidth = 1
        contentView.layer.borderColor = UIColor.clear.cgColor
        contentView.layer.masksToBounds = true

        layer.shadowColor = shadowColor.cgColor
        layer.shadowOffset = shadowOffset
        layer.shadowRadius = shadowRadius
        layer.shadowOpacity = shadowOpacity
        layer.masksToBounds = false
        layer.shadowPath = UIBezierPath(roundedRect: bounds, cornerRadius: radius).cgPath
        layer.cornerRadius = radius
    }
}
Run Code Online (Sandbox Code Playgroud)