目标C在tableview中滚动时动画错误的按钮

时间:2014-08-14 22:21:12

标签: ios objective-c uitableview

- (IBAction)playShout:(UIButton *)sender {

    self.tableView.userInteractionEnabled=NO;


    CGPoint point = [sender.superview convertPoint:sender.frame.origin toView:self.tableView];
    NSIndexPath *indexPath = self.tempIndexPath;//[self.tableView indexPathForRowAtPoint:point];


    DisplayPersonTableViewCell * cell=[self.tableView cellForRowAtIndexPath:indexPath];
    UIButton * button=cell.playButton;

     self.tableView.userInteractionEnabled=YES;
    PFObject * shoutToPlay=[self.shoutsArrayForUserBeingDisplayed objectAtIndex:indexPath.row];
    [shoutToPlay fetchIfNeeded];
     [AnimationViewController endCircleAnimation];

    NSData * audioData=[self.audioDataDict objectForKey:shoutToPlay.objectId];





    if (player.playing)    {
        if(player.data==audioData)    {


            [player stop];
            [AnimationViewController endCircleAnimation];

        } else{

            [self setAllTableViewCellsToPlayButton];
            [AnimationViewController endCircleAnimation];


            sender.layer.cornerRadius=sender.frame.size.width/2;

            player = [[AVAudioPlayer alloc] initWithData:audioData error:nil];
            player.delegate=self;
            [player prepareToPlay];
            if (DISPLAY_IS_MUTED)  {
                player.volume=0;
            }
            [player play];
            [AnimationViewController animateButton:cell.playButton ForDuration:player.duration withColor:[UIColor whiteColor]];
        }
    } else {

        sender.layer.cornerRadius=sender.frame.size.width/2;

        player = [[AVAudioPlayer alloc] initWithData:audioData error:nil];
        player.delegate=self;
        [player prepareToPlay];
        if (DISPLAY_IS_MUTED)  {
            player.volume=0;
        }
        [player play];
        [AnimationViewController animateButton:sender ForDuration:player.duration withColor:[UIColor whiteColor]];
    }

}

当然,非常简单,非常容易。但是如果我在该单元格中的按钮上执行动画,然后滚动tableview,它将切换并开始动画错误的单元格。这就好像superview框架正在改变的事实会影响哪个按钮被动画化。 有什么建议吗?

动画方法:

+(void)animateButton:(UIButton *)button ForDuration:(NSTimeInterval)duration withColor:(UIColor *)color    {
    circle = [CAShapeLayer layer];
    circle.fillColor = nil;
    circle.lineWidth = button.frame.size.height/2+2;
    circle.strokeColor = color.CGColor;
    circle.bounds = CGRectMake(0, 0,    button.frame.size.width/2, button.frame.size.height/2);
    circle.frame= CGRectMake(button.frame.size.width/4, button.frame.size.height/4, button.frame.size.width/2+2, button.frame.size.height/2+2);
    circle.path = [UIBezierPath bezierPathWithOvalInRect:circle.bounds].CGPath;
    [button.layer addSublayer:circle];
    CABasicAnimation *drawAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
    drawAnimation.duration            = duration;
    drawAnimation.repeatCount         = 1.0;
    drawAnimation.removedOnCompletion = YES;
    drawAnimation.fromValue = [NSNumber numberWithFloat:0.0f];
    drawAnimation.toValue   = [NSNumber numberWithFloat:1.0f];
    drawAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
    [circle addAnimation:drawAnimation forKey:@"drawCircleAnimation"];
}

1 个答案:

答案 0 :(得分:0)

您是否在单元格中实现了prepareForReuse方法?在那里你必须停止运行动画并重置单元的状态以便重用。

来自文档:

prepareForReuse 准备一个可重用的单元格,供表视图的委托重用。

  

如果UITableViewCell对象是可重用的 - 也就是说,它具有重用标识符 - 在返回对象之前调用此方法   来自UITableView方法dequeueReusableCellWithIdentifier:。对于   性能原因,你应该只重置那个单元格的属性   与内容无关,例如,alpha,编辑和选择   州。 tableView中的表视图委托:cellForRowAtIndexPath:   重复使用单元格时应始终重置所有内容。如果是细胞   对象没有关联的重用标识符,此方法是   不叫。如果重写此方法,则必须确保调用   超类实现。

您需要实现自定义UITableViewCell(创建它的子类)并实现prepareForReuse方法。

在那里你可以编写停止动画的逻辑。