我有一个带有三个标签的自定义UITableViewCell - 标题,副标题和右侧细节。 现在,当用户点击单元格时,此单元格将使用正常的复选标记进行检查,但我需要将右侧标签设置为左侧的动画。我以为我可以做到
CGRect rect = cell.playerRatingLabel.frame;
rect.origin.x -= 10;
[CLCPlayerViewCell animateWithDuration:1.0 animations:^{
cell.playerRatingLabel.frame = rect;
}];
但这似乎什么都不做。我认为这是关于约束但我不知道如何处理这个,我正在使用自动布局。
感谢您的帮助
答案 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"];
}