UITableViewCell按钮自定义单元格内的动画,我得到错误的单元格索引路径来显示动画

时间:2016-08-16 15:47:43

标签: ios objective-c uitableview animation

我在UITableViewCell内有我的按钮动画问题。

当我按下按钮的单元格时,我希望它显示动画,但UITableViewCell内的按钮的可见和最后一个对象只能显示动画。

我希望我按下UITableView的{​​{1}}单元格内的按钮,indexPath 0的按钮就可以显示动画了。

indexPath

谢谢!

1 个答案:

答案 0 :(得分:1)

您的代码中存在很多问题。

首先删除属性以引用单元格。它没有按照你的想法去做。你也不需要按钮点击事件。

这要求您按如下方式更新cellForRowAtIndexPath方法:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    ListTableViewCell *cell = (ListTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"listCell" forIndexPath:indexPath];

    //Btn setting    
    [cell.listLoveBtn addTarget:self action:@selector(loveBtnPressed:) forControlEvents:UIControlEventTouchUpInside];

    return cell;
}

对于按钮处理程序,您不需要该事件。只需获取按钮的框架并将其转换为表格视图的坐标即可。用它来从表中获取单元格。请注意,按钮处理程序不是IBAction

还要避免将大量代码嵌套到一行中。拆分线。当出现问题时,它使读取更容易,也更容易调试。

- (void)loveBtnPressed:(UIButton *)button {
    CGPoint buttonPoint = CGPointMake(5, 5); // A point within the button
    CGPoint tablePoint = [button convertPoint:buttonPoint toView:self.listTableView]; // Convert point to table view coordinates
    NSIndexPath *indexPath = [self.listTableView indexPathForRowAtPoint:tablePoint]; // Get the index path

    NSLog(@"btn pressed indexpath is %ld",(long)indexPath.row);

    //set button pressed animated
    ListTableViewCell *cell = [self.listTableView cellForRowAtIndexPath:indexPath]; // Get the cell for the index path
    UIImage *image = [UIImage imageNamed:pressedCounts % 2 == 0 ? @"listUnlikeBtn" : @"listLikeBtn"];
    [cell.listLoveBtn setImage:image forState:UIControlStateNormal];

    CAKeyframeAnimation *btnAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
    btnAnimation.values = @[@(0.1),@(1.0),@(1.5)];
    btnAnimation.keyTimes = @[@(0.0),@(0.5),@(0.8),@(1.0)];
    btnAnimation.calculationMode = kCAAnimationLinear;

    pressedCounts++;

    [cell.listLoveBtn.layer addAnimation:btnAnimation forKey:@"Animation"];
}