重用的tableView单元格不调用layoutSubviews方法

时间:2014-08-02 01:54:44

标签: ios cocoa-touch uitableview

我有一个自定义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}}

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;
}