【问题标题】:UITableViewCell doesn't clear context before drawingUITableViewCell 在绘制之前不清除上下文
【发布时间】:2010-02-10 15:42:18
【问题描述】:

我有一个 UITableViewCell 的子类,其中包含几个元素 - UIImageViews、标签等。
由于此单元格旨在可重复使用,因此我希望能够根据当前显示的数据稍微更改其外观。

举个例子——我的自定义 UITableViewCell 中有这个视图:

UIImageView* delimeterView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cellDelimiter.png"]];

有时我希望能够像这样隐藏:

- (void) setRecord:(id)record__ {  
    if (record__.type == NO_DELIMETER_VIEW)  
        delimeterView.hidden = YES;  
    else  
        delimeterView.hidden = NO;
    [self setNeedsLayout];   
} 

但问题在于,delimeterView 将始终显示在单元格上,就像它在 init 方法中绘制一次然后绘制上下文从未更改或清除一样。我已经尝试将单元格及其 contentView 的 clearsContextBeforeDrawing 属性设置为 YES,我还尝试将单元格及其 contentView 的 opaque 设置为 NO,因为我已经阅读过,如果您使用透明,则可能存在一些问题意见。
没有任何帮助。
看起来 UITableViewCell 从不清除其图形上下文,而只是在旧元素上进行绘制。
关于我做错了什么的任何提示? 我知道我可以通过自定义绘图来解决这个问题,但我不想这样做。

【问题讨论】:

  • 你是否在每次从 -[UITableView cellForRowAtIndexPath:] 返回单元格时调用 -setRecord: (或者它被传递给 -[UITableViewDelegate tableView:willDisplayCell:forRowAtIndexPath:])?
  • 是的,它旨在每次在 cellForRowAtIndexPath 方法中调用。

标签: iphone objective-c uitableview


【解决方案1】:

首先,您确定setRecord: 中的delimeterView 实际上指向您的delimeterView?在您提供的代码示例中,您将其分配给本地。你稍后将其分配给 ivar 吗? (您应该始终使用访问器来访问 ivars:self.delimeterView)。

接下来,调用-setNeedsLayout 只是安排调用-layoutIfNeeded,它遍历调用-layoutSubviews 的层次结构。 -layoutSubviews 的默认实现什么都不做。您可能打算在这里调用-setNeedsDisplay,或者您需要实现-layoutSubviews 来做您想做的事情。

【讨论】:

  • 好吧,setNeedsDisplay 实际上是正确的方法。感谢您指出这一点。
猜你喜欢
  • 1970-01-01
  • 2012-08-03
  • 1970-01-01
  • 2019-01-14
  • 1970-01-01
  • 2017-09-25
  • 2015-03-04
  • 1970-01-01
  • 2018-01-06
相关资源
最近更新 更多