我有一个带有自定义单元格的UITableView,我想要底部阴影/阴影。为此,我使用此代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myTableViewCell" forIndexPath:indexPath];
cell.layer.shouldRasterize = YES;
cell.layer.rasterizationScale = [UIScreen mainScreen].scale;
cell.layer.shadowColor = [[UIColor blackColor] CGColor];
cell.layer.shadowOffset = CGSizeMake(0.0f, 0.0f);
cell.layer.shadowRadius = 1.0f;
cell.layer.shadowOpacity = 1.0f;
CGPathRef shadowPath = [UIBezierPath bezierPathWithRect:cell.bounds].CGPath;
cell.layer.shadowPath = shadowPath;
return cell;
}
当桌面视图向下滚动或根本没有滚动时,阴影看起来像预期的那样: http://oi62.tinypic.com/ev1gn4.jpg
但是,无论何时向上滚动,阴影都会从单元格的底部移动到顶部: http://oi60.tinypic.com/2r4kdjl.jpg
我怀疑它与每次滚动tableview时呈现的阴影有关,但我不知道如何解决它。
我哪里错了?
提前多多感谢。
答案 0 :(得分:4)
首先,我建议不要在每个细胞中填充细胞层。也就是说,如果你有多个单元格的屏幕,它会使TableView滚动非常不平滑。 我做了同样的事情,但在添加到单元格的ImageView中,它很糟糕。我的解决方案是创建一个包含阴影的UIImage / UIView,并将其作为子视图添加,阴影效果不是很好,但是这样做很容易:
- (UIView*)shadowWithRect:(CGRect)rect {
UIView* v = [[UIView alloc] initWithFrame:rect];
CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = v.bounds;
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor clearColor] CGColor], nil];
[v.layer insertSublayer:gradient atIndex:0];
return v;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"shadowCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
[cell addSubview:[self shadowWithRect:cell.bounds]];
return cell;
}
也许可以在一个属性或其他东西中“保存”该视图,以避免每次都重新创建。 另外,不要忘记删除/不添加多个“阴影”,否则它看起来很奇怪。
答案 1 :(得分:2)
您已将阴影设置为围绕整个单元格。根据绘制单元格的顺序,您将看到顶部阴影或底部阴影。设置阴影,使其仅显示在单元格的底部而不是顶部。使用shadowOffset
进行游戏以将阴影向下移动,使其不会出现在单元格的顶部。您可能还需要更改shadowRadius
。