我有一个自定义tableViewCell
类,在我的tableView单元格中,我有一个自定义UIView
。每个tableView单元格都与唯一UIBezierPath
相关联,该path
设置为等于视图layoutSubviews
属性。为了渲染路径,必须调用layoutSubviews
。我注意到我的前5个单元格正在调用layoutSubviews
,但接下来的5个单元格不会调用layOutSubviews
,因此它们的路径最终不会被渲染,它们最终会重用第一个路径5个细胞。由于第二个5个单元格只是重用前5个单元格,我如何为每个单元格调用- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString* identifier = @"audioTableCell";
OSAudioTableCell *cell = [self.audioTable dequeueReusableCellWithIdentifier:identifier];
if(cell == nil)
{
cell = [[OSAudioTableCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: identifier];
}
Recording * recording = [self.managedDocument.frc objectAtIndexPath:indexPath];
cell.waveView.path = nil;
cell.waveView.minAmpl = [recording.minAmpl floatValue];
NSData * pathData = recording.waveData;
//Setting the path
cell.waveView.path = [NSKeyedUnarchiver unarchiveObjectWithData:pathData];
[cell setImageSize:cell.waveView.bounds.size];
}
?
-(void) layoutSubviews
{
if (!self.blueWave) {
self.blueWave = [self createShapeLayer];
self.blueWave.strokeColor = [UIColor colorWithRed:107/255.0f green:212/255.0f blue:231/255.0f alpha:1.0f].CGColor;
self.redWave = [self createShapeLayer];
self.redWave.strokeColor = [UIColor redColor].CGColor;
self.redWave.strokeEnd = self.progress;
[self.layer addSublayer:self.blueWave];
[self.layer insertSublayer:self.redWave above:self.blueWave];
[self render];
}
}
//这是我的自定义UIView类waveView中第一个被调用的方法
{{1}}
答案 0 :(得分:0)
所以无论我怎样尝试,layOutSubviews
都没有被我的重复使用的细胞调用。我试图将UIView
路径设置为nil,然后调用setNeedsLayout
,但这没有做任何事情。我尝试清除prepareForReuse
中的路径,但仍然没有运气。我必须做的是每当重复使用一个单元时手动删除CAShapeLayers
。这就行了。
if(cell == nil)
{
cell = [[OSAudioTableCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: identifier];
}
else
{
[cell.waveView.blueWave removeFromSuperlayer];
[cell.waveView.redWave removeFromSuperlayer];
cell.waveView.blueWave = nil;
cell.waveView.redWave = nil;
cell.waveView.path = nil;
cell.trackLabel.text = nil;
}