微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios – UITableViewCell中的CALayer阴影绘制不正确

我正在使用CALayer将阴影应用于UITableViewCell.

这是我的代码

- (void)addShadowToView:(UIView *)view
{
    // shadow
    view.layer.shadowColor = [[UIColor colorWithWhite:0.0f alpha:0.1f] CGColor];
    view.layer.shadowOpacity = 1.0f;
    view.layer.shadowOffset = CGSizeMake(0.0f,3.0f);
    view.layer.shadowRadius = 6.0f;

    CGRect shadowFrame = view.layer.bounds;
    CGPathRef shadowPath = [UIBezierPath bezierPathWithRect:shadowFrame].CGPath;
    view.layer.shadowPath = shadowPath;
}

问题是对于某些tableviewcells,阴影不会跨越单元格的整个宽度.对于某些细胞来说,这是正确的,对于其他细胞则是错误的.我注意到设备的旋转也会影响它,并且重新加载tableview数据有时会解决它.

缓解此问题的最佳方法是什么(并且我不是要在每次轮换时重新加载整个tableview等)?

正确应用阴影的单元格底部示例:

向下滚动后同一个tableview中的单元格底部(阴影仅应用于宽度的前75%):

编辑:我注意到问题是由这些代码行引起的:

CGRect shadowFrame = view.layer.bounds;
CGPathRef shadowPath = [UIBezierPath bezierPathWithRect:shadowFrame].CGPath;
view.layer.shadowPath = shadowPath;

如果我把它们抛弃,一切都很好.但是我被告知使用它时会有一些性能上的好处.不知何故,旋转后阴影未正确应用于新尺寸.

解决方法

您可以为单元格的框架覆盖setter并调用addShadowToView:.您可以通过存储单元格的大小来更多地优化它,并且仅在大小更改时更新阴影路径,例如:
@property (nonatomic,assign) CGSize size;

- (void) setFrame:(CGRect)frame
{
    [super setFrame:frame];
    // Need to check make sure this subview has been initialized
    if(self.subviewThatNeedsShadow != nil && !CGSizeEqualToSize(self.size,_frame.size)
    {
        [self addShadowToView: self.subviewThatNeedsShadow];
    }
}

原文地址:https://www.jb51.cc/iOS/328540.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐