在 UITableViewCell 内自定义绘制 UIView
Posted
技术标签:
【中文标题】在 UITableViewCell 内自定义绘制 UIView【英文标题】:Custom drawing UIView inside of UITableViewCell 【发布时间】:2014-01-21 17:44:12 【问题描述】:我正在创建一个绘制统计信息的 UIView(实际上是 contentView 中的子视图之一)。
这个视图设置在 UITableview 的每个单元格中。
我配置单元格,在:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
NSString *cellConstant = @"constant";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellConstant forIndexPath:indexPath];
SCHGraphicView *statView = (SCHGraphicView *)[cell viewWithTag:TAG_STAT_GRAPH];
[statView setStatValues:[self.listOfListWithValues objectAtIndex:indexPath.row] andBase:10 andColorBar:[UIColor whiteColor]];
return cell;
这是 drawRect 方法,现在在测试模式下我只绘制一个值。
- (void)drawRect:(CGRect)rect
CGFloat heightCalculate = ([(NSNumber *)[self.statValues objectAtIndex:1]intValue] *self.frame.size.height) / self.base;
//We create the path
UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(0,self.frame.size.height - heightCalculate, self.frame.size.width, heightCalculate)];
path.lineWidth = 0;
[self.barColor setFill];
CGContextRef context = UIGraphicsGetCurrentContext();
//We saved the context
CGContextSaveGState(context);
[path fill];
//Restore the contex
CGContextRestoreGState(context);
虽然我每次都在cellForRowAtIndexPath:
中修改统计值,但这些值不会调用 [UIView setNeedDisplay] 所以我不会每次都重绘它,因为每个单元格中的统计永远不会改变,但如果是不同的统计您比较单元格之间的统计数据。
问题是当我滚动并返回第一个单元格时,它不包含最初绘制的统计数据。
我实现这一目标的唯一方法是每次重绘cellForRowAtIndexPath
中的统计信息
但我认为在第一次绘制视图时保存了预览,这用于提高性能,如果您调用 [UIView setNeedDisplay] 视图将再次重绘。
有什么想法吗?
非常感谢
【问题讨论】:
【参考方案1】:在UITableViewCell
上实现drawRect:
时遇到了奇怪的问题,看来您不应该这样做。相反,您应该创建 UIView
并将其添加为 contentView
属性的子视图。这里和网上有很多关于drawRect:
和UITableViewCell
的问题/答案,其中大多数建议你不要这样做。
subclassed UITableViewCell - backgroundView covers up anything I do in drawRect
【讨论】:
是的,我做到了,我已经创建了一个视图。实际上是 contentView 中的子视图之一。谢谢你的回答:)以上是关于在 UITableViewCell 内自定义绘制 UIView的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 7 上的 UITableViewCell 之间绘制自定义分隔线
在 UIActivityItemProvider 内自定义 UIActivityTypePostToFacebook 的行为