【发布时间】:2023-11-27 16:08:01
【问题描述】:
我有子类 UITableViewCell 类以在我的单元格下方添加阴影。当 TableView 出现在屏幕上时,阴影被正确添加。但是,当我向下滚动 tableview 时,带有阴影的单元格隐藏在屏幕上方,阴影消失了。
- (void)layoutSubviews {
[super layoutSubviews];
if (self.shouldAddShadow) {
self.layer.shadowOpacity = 0.5;
self.layer.shadowRadius = 1.5;
self.layer.shadowOffset = CGSizeMake(0, 3);
self.layer.shadowColor = [[[UIColor appDarkDividerColor] colorWithAlphaComponent:0.9] CGColor];
[self setClipsToBounds:NO];
[self.layer setMasksToBounds:NO];
CGRect shadowFrame = self.layer.bounds;
CGPathRef shadowPath = [UIBezierPath bezierPathWithRect:shadowFrame].CGPath;
self.layer.shadowPath = shadowPath;
}
}
忘了提一下,我有带静态单元格的表格视图;所以没有调用 prepareForReuse 。我的单元格有插座,因此我还尝试在 scrollViewDidScroll: 方法中为我的单元格设置阴影。即使这对我没有帮助
【问题讨论】:
-
我的猜测是,当单元格被重用时,
self.shouldAddShadow可能是 FALSE。您在代码中的哪个位置将该标志设置为 TRUE/FALSE? -
这可能与cell的复用机制有关。我可能会建议两件事。首先 - 在 [super layoutSubviews] 之后添加 NSLog(@"self.shouldAddShadow = %@", self.shouldAddShadow ? @"YES" : @"NO") 消息;看看发生这种情况时你的旗帜发生了什么。第二 - 也许让这个影子事物成为一个方法并在你配置你的单元格时调用它?
-
忘了提,我有带静态单元格的表格视图;所以没有调用 prepareForReuse 。我的单元格有插座,因此我还尝试在 scrollViewDidScroll: 方法中为我的单元格设置阴影。即使这对我没有帮助
-
您可能需要在滚动时使用 [cell setNeedsLayout] 强制布局。这可能就足够了,或者您可能需要调用 [cell layoutIfNeeded] 来强制布局。你可以把这个调用放在委托方法
tableView:willDisplayCell:forRowAtIndexPath中。 -
FWIW,我现在遇到了完全相同的问题,到目前为止还无法解决。
标签: ios objective-c uitableview shadow