无法在UICollectionViewCell上设置阴影并具有圆角.一次只能做一件事

use*_*977 3 calayer cgpath ios uicollectionviewcell cgpathref

我有一个UICollectionViewCell子类,我需要绕其角并添加阴影.该单元看起来像一张方形卡,单元格之间有足够的空间.

因此,在每个单元格"下面",我想添加一些阴影.我可以成功地做到这一点,但后来我的手机底部只有圆角.顶部只有正常的角落.我需要所有四个角的圆角.

我已经在这里找到了解决方案UIViews,建议添加一个单独UIViewsubview,但我更愿意出于性能原因避免这种情况.

我找到了一个使用此方法的解决方案,您可以在我的代码中找到:

[UIBezierPath bezierPathWithRoundedRect: cornerRadius:]

但这对我来说也不起作用.是否有可能它不适合我,因为我试图只在单元格的底部添加阴影"下面"?似乎大多数这些答案都是针对开发人员想要在整个单元格周围添加阴影的问题提供的.

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

我的目标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;

}
Run Code Online (Sandbox Code Playgroud)

编辑:如果我设置self.layer.masksToBoundsNO,影子工程,但顶角不圆.如果我设置self.layer.masksToBoundsYES,阴影不起作用,但现在所有四个角都是圆角的.我只是无法弄清楚如何围绕所有四个角并让阴影工作.

use*_*977 5

在看了Timothy Moose在评论中分享的样本项目之后,我意识到我确实做了几乎与他完全一样的事情.

出于沮丧,我重新访问了我的单元格nib文件,它终于打了我.我UIView在单元格的顶部添加了一个.这个视图作为彩色横幅,也作为另一个UIImageView和一个容器的容器UILabel.

顶部UICollectionViewCell成功地绕过顶角,但你永远不会知道,因为彩色UIView位于细胞的顶部,并且与细胞一样宽.

愚蠢的错误,很多次是它的小事.

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

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

}
Run Code Online (Sandbox Code Playgroud)