不能在 UICollectionViewCell 上设置阴影和圆角。一次只能做一件作品

Can't set shadow on UICollectionViewCell and have rounded corners. Can only make one work at a time

我有一个 UICollectionViewCell 子类,我需要圆化它的角并添加阴影。单元格看起来像一张方形卡片,单元格之间有大量 space。

所以"underneath"每个单元格,我想添加一些阴影。我可以成功地做到这一点,但是我的单元格只有底部的圆角。顶部只有正常的角。我的四个角都需要圆角。

我在这里找到了 UIViews 的解决方案,建议添加一个单独的 UIView 作为 subview,但出于性能原因我宁愿避免这样做。

我确实找到了一种解决方案,即使用此方法,您可以在下面的代码中找到它:

[UIBezierPath bezierPathWithRoundedRect: cornerRadius:]

但这对我也不起作用。是否有可能因为我试图只在单元格底部添加阴影 "underneath" / 而对我不起作用?似乎大多数答案都是针对开发人员想要在整个单元格周围添加阴影的问题。

我想我愿意为我的 UICollectionViewCell 子类添加一个特殊的 subview,但我想将其用作最后的手段。

我的目标是 iOS 7+ 并使用 Xcode 6.1.1.

这是我在 UICollectionViewCell 子类中使用的代码,用于尝试实现阴影和圆角:

- (void)load:(CustomUserObject *)customObject
{
    self.customObject = customObject;

    // Round cell corners
    self.layer.cornerRadius = 12;

    // Add shadow
    self.layer.masksToBounds = NO;
    self.layer.shadowOpacity = 0.75f;
    self.layer.shadowRadius = 10.0f;
    self.layer.shouldRasterize = NO;
    self.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(self.frame.size.width/2 - (self.frame.size.width - 50)/2, self.frame.size.height, self.frame.size.width - 50, 10) cornerRadius:self.layer.cornerRadius].CGPath;

}

编辑:如果我将 self.layer.masksToBounds 设置为 NO,阴影有效但顶角不圆。如果我将 self.layer.masksToBounds 设置为 YES,阴影不起作用,但现在所有四个角都变圆了。我只是想不出如何将所有四个角都圆化并使阴影起作用。

在看了 Timothy Moose 在评论中分享的示例项目后,我意识到我所做的一切几乎都和他一样。

出于沮丧,我重新访问了我手机的 nib 文件,它终于击中了我。我在单元格的顶部添加了一个 UIView 。此视图用作彩色横幅,还用作另一个 UIImageViewUILabel.

的容器

UICollectionViewCell 的顶部成功地圆化了顶角,但您永远不会知道,因为彩色 UIView 位于单元格的顶部并且与单元格一样宽.

愚蠢的错误,很多时候都是小事。

这是我用来实现四个圆角和 UICollectionViewCell 下面的阴影的最终代码。 self.banner 是隐藏单元格顶角的额外 UIView

- (void)load:(CustomUserObject *)customObject
{
    self.customObject = customObject;

    // Round the banner's corners
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.banner.bounds
                                                   byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerTopRight)
                                                         cornerRadii:CGSizeMake(10, 10)];

    CAShapeLayer *maskLayer = [CAShapeLayer layer];
    maskLayer.frame = self.banner.bounds;
    maskLayer.path = maskPath.CGPath;
    self.banner.layer.mask = maskLayer;

    // Round cell corners
    self.layer.cornerRadius = 10;

    // Add shadow
    self.layer.masksToBounds = NO;
    self.layer.shadowOpacity = 0.75f;
    self.layer.shadowRadius = 10.0f;
    self.layer.shouldRasterize = NO;
    self.layer.shadowPath = [UIBezierPath bezierPathWithRect:CGRectMake(self.frame.size.width/2 - (self.frame.size.width - 50)/2, self.frame.size.height, self.frame.size.width - 50, 10)].CGPath;

}
func dropShadow() {
    self.layer.masksToBounds = false
    self.layer.shadowColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.25).cgColor
    self.layer.shadowOpacity = 0.5
    self.layer.shadowOffset = CGSize(width: 0.0, height: 2.0)
    self.layer.shadowRadius = 4.0
    self.layer.cornerRadius = 5.0
}

//投影使用

cell.dropShadow()