UITableViewCell 的自定义行动画
Posted
技术标签:
【中文标题】UITableViewCell 的自定义行动画【英文标题】:Custom Row Animations for UITableViewCell 【发布时间】:2014-05-29 08:43:32 【问题描述】:当我需要刷新 UITableView 时,我需要一些自定义动画。我在寻找类似的东西:
[self.table reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationLeft];
但要设置我自己的动画。如果这个动画基于 UITableViewCell 就完美了,因为我只需要对单元格中的一些元素进行动画处理。
我想做什么:
我有这样的自定义单元格
___________________________________
| lable |separator| lable 2 |
-----------------------------------
我希望标签 2 向左或向右滑动,而不是整个单元格。
马尔科
【问题讨论】:
【参考方案1】:在 .h 中,您将拥有 reloadInWithMyOwnAnimation BOOL 变量。在重新加载该部分之前,请将其设置为 YES。重新加载后将其设置为否。
reloadingWithMyOwnAnimation = YES;
[tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationLeft];
reloadingWithMyOwnAnimation = NO;
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
UITableViewCell *myCustomCell = cell;
BOOL swipeLeft = YES;
if (reloadingWithMyOwnAnimation == YES)
[UIView animateWithDuration:0.8f animations:^
if (swipeLeft)
//Swipe Right
//Get the label frame
CGRect myLabelFrame = myCustomCell.textLabel.frame;
//Set it to 0
myLabelFrame.origin.x = 0;
//Move it to Right
myLabelFrame.origin.x += cell.bounds.size.width;
//Set the frame of the label
[myCustomCell.textLabel setFrame:myLabelFrame];
else
//Swipe Left
//Get the label frame
CGRect myLabelFrame = myCustomCell.textLabel.frame;
//Set it to 0
myLabelFrame.origin.x = 0;
//Move it to Left
myLabelFrame.origin.x -= cell.bounds.size.width;
//Set the frame of the label
[myCustomCell.textLabel setFrame:myLabelFrame];
[myCustomCell layoutSubviews];
completion:^(BOOL finished)
NSLog(@"Done");
];
【讨论】:
【参考方案2】:我认为您必须拥有自定义 UITableViewCell 类,并且您必须在那里实现类似的方法,
- (void)swipeLabel2Out
UIView animateWithDuration:1.0 animations:^
// set the frame of your label2
completion:^(BOOL finished)
// hide your label2
您可以使用该方法轻松跟踪您的细胞
- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath
并调用 [cell swipeLabel2Out];方法。
【讨论】:
【参考方案3】:希望对您有所帮助
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
NSString *MyIdentifier = [NSString stringWithFormat:@"MyIdentifier%d",indexPath.row];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:MyIdentifier];
cell.backgroundColor = [UIColor clearColor];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
label = [[UILabel alloc]initWithFrame:CGRectMake(100, 0, 100, 50)];
label.backgroundColor = [UIColor blueColor];
label.text = @"Test";
label.tag = indexPath.row;
[label setUserInteractionEnabled:YES];
[cell.contentView addSubview:label];
[arrayLabel addObject:label];
UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipedGesture:)];
swipe.direction = UISwipeGestureRecognizerDirectionRight;
swipe.numberOfTouchesRequired = 1;
[label addGestureRecognizer:swipe];
return cell;
- (void)swipedGesture:(UIGestureRecognizer *)recognizer
[UIView animateWithDuration:1
animations:^
CGRect rect = label.frame;
rect.origin.x = 320;
label.frame = rect;
completion:^(BOOL finished)
NSLog(@"completion block");
];
【讨论】:
以上是关于UITableViewCell 的自定义行动画的主要内容,如果未能解决你的问题,请参考以下文章