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 的自定义行动画的主要内容,如果未能解决你的问题,请参考以下文章

列表视图自定义行

xlform 使用笔尖的自定义行

尤里卡中的自定​​义行

Typeahead 在建议末尾添加自定义行

Leanback 创建不同的自定义行视图

由于 UITextView 中的自定义行距,文本选择不正确