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

标签 ios objective-c uitableview 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 等)?

正确应用阴影的单元格底部示例: enter image description here

向下滚动后同一表格 View 中单元格的底部(阴影仅应用于宽度的前 75%): enter image description here

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

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];
    }
}

关于ios - UITableViewCell 中的 CALayer 阴影绘制不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38623815/

相关文章:

ios - 视频的 scaleTimeRange 防止在 Xcode 7 上以 Swift 2.0+ 导出视频

iphone - 开发iphone应用程序的编码标准

uitableview - TableView 重新加载不适用于 SwiftUI 中的 UIViewRepresentable

ios - UITableView 部分标题 View 在滚动时消失

ios - 将圆角和边框设置为 ios7 中 UISearchBar 的背景(不是 UITextField)

iOS:来自 iOS14 EXC_BAD_ACCESS 线程队列的随机错误消息:NSManagedObjectContext NSInternalAdditionsforgetObjectpropagateToObjectStore

ios - UISearchController 在 iPad 上显示全屏而不是弹出窗口

ios - 尝试实现相机功能时,xcode 向不兼容类型警告参数抛出 "DetailViewController *"

ios - 如何取消 iOS 中的完成处理程序

ios - 基于图像大小的单元格行高