在UITableViewCell中动画UILabel

时间:2013-08-29 15:42:38

标签: ios objective-c uitableview cocoa-touch uikit

我有一个带有三个标签的自定义UITableViewCell - 标题,副标题和右侧细节。 现在,当用户点击单元格时,此单元格将使用正常的复选标记进行检查,但我需要将右侧标签设置为左侧的动画。我以为我可以做到

CGRect rect = cell.playerRatingLabel.frame;
rect.origin.x -= 10;
[CLCPlayerViewCell animateWithDuration:1.0 animations:^{
    cell.playerRatingLabel.frame = rect;
}];

但这似乎什么都不做。我认为这是关于约束但我不知道如何处理这个,我正在使用自动布局。

感谢您的帮助

3 个答案:

答案 0 :(得分:3)

您的playerRatingLabel应该对单元格的右边缘有约束。您的自定义单元格需要将IBOutlet设置为该约束。然后在单元格点击上,为该约束的常量参数设置动画(我在示例中称为插座rightCon):

[UIView animateWithDuration:1.0 animations:^{
    cell.rightCon.constant = 30; // change this value to meet your needs
    [cell layoutIfNeeded];
}];

以下是我用来执行此操作的完整实现。我的自定义单元格有两个标签,当您单击一个单元格并添加复选标记时,我会为其设置动画。我创建了一个属性selectedPaths(一个可变数组)来跟踪被检查的单元格。如果单击已经选中的单元格,则会取消选中该单元格,并将标签动画回原始位置。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    RDCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    cell.leftLabel.text = self.theData[indexPath.row];
    cell.accessoryType = ([self.selectedPaths containsObject:indexPath])? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
    cell.rightCon.constant = ([self.selectedPaths containsObject:indexPath])? 40 : 8;
    return cell;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    RDCell *cell = (RDCell *)[tableView cellForRowAtIndexPath:indexPath];
    if (! [self.selectedPaths containsObject:indexPath]) {
        [self.selectedPaths addObject:indexPath];
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        [UIView animateWithDuration:.3 animations:^{
            cell.rightCon.constant = 40;
            [cell layoutIfNeeded];
        }];
    }else{
        [self.selectedPaths removeObject:indexPath];
        cell.accessoryType = UITableViewCellAccessoryNone;
        [UIView animateWithDuration:.3 animations:^{
            cell.rightCon.constant = 8;
            [cell layoutIfNeeded];
        }];
    }
}

答案 1 :(得分:0)

您正在尝试调整不会产生任何影响的单元格框架。尝试调整单元格contentView的框架。

答案 2 :(得分:0)

我想以下功能将解决您的问题 将你的标签传递给cell.textLabel.layer并传递像

这样的点
CGPointMake(0, self.view.center.y)

-(void)moveLayer:(CALayer*)layer to:(CGPoint)point
{
// Prepare the animation from the current position to the new position
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
animation.fromValue = [layer valueForKey:@"position"];
animation.duration = 0.2;

animation.toValue = [NSValue valueWithCGPoint:point];

// Update the layer's position so that the layer doesn't snap back when the animation completes.
layer.position = point;

// Add the animation, overriding the implicit animation.
[layer addAnimation:animation forKey:@"position"];
}