添加新的UITableViewRow会过快地推动现有单元格

时间:2014-02-24 21:13:31

标签: ios objective-c uitableview uiviewanimation

我正在尝试像Peek Calendar一样创建UITableCellView动画。从这里可以看出:

enter image description here

我正在使用UITableView和以下动画代码

//Animaiton for the table view cells to appear
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{

    if([cell.reuseIdentifier isEqualToString:@"HolidayCell"]) {

        int x = (indexPath.row-self.selectedMonth) %2;
        //1. Setup the CATransform3D structure
        CATransform3D rotation;
        CATransform3D position;

        position = CATransform3DMakeTranslation(0, -36, 0) ;

        //rotation.m33 = 12;
        UILabel *shadow = (UILabel*)[cell.contentView viewWithTag:2];

        //2. Define the initial state (Before the animation)
        cell.alpha = 1;
        shadow.alpha = 0.75;

        if(x==1) {
            rotation = CATransform3DMakeRotation((-90.0*M_PI)/180, 1.5, 0.0, 0.0);
            rotation.m34 = 0.0059;
            cell.layer.anchorPoint = CGPointMake(0.5, 0.0);    
        }
        else
        {
            rotation = CATransform3DMakeRotation((90.0*M_PI)/180, 1.5, 0.0, 0.0);
            rotation.m34 = 0.0059;
            cell.layer.anchorPoint = CGPointMake(0.5, 1.0);
        }

        cell.layer.transform = CATransform3DConcat(position, rotation);

        //3. Define the final state (After the animation) and commit the animation
        [UIView beginAnimations:@"rotation" context:NULL];
        [UIView setAnimationDuration:2.3];
        //[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:cell cache:YES];
        cell.layer.transform = CATransform3DIdentity;
        cell.alpha = 1;
        shadow.alpha = 0;
        //cell.layer.shadowOff

 1. List item

set = CGSizeMake(0, 0);
        [UIView commitAnimations];
    }
}

现在我对动画没有任何特别的问题。细胞旋转得很好。然而我的问题是,当我插入一个单元格时,即使在旋转时它仍然占用空间,就像它完全打开一样。

正如你所看到的那样,细胞在“虚拟盒子”中旋转,但我希望细胞粘在一起,如图所示:

enter image description here

有没有人知道如何做到这一点?

2 个答案:

答案 0 :(得分:0)

您没有变换帧,只变换图层。该图层仅是单元格的可视化表示,并不定义单元格的大小或位置。

我相信,在tableView中,单元格的框架首先由heightForRowAtIndexPath:方法定义,但您应该可以使用“frame”属性更改并为其设置动画。尝试将其设置为零,并在单元格出现时设置为最终高度。

代码,终于给出了解决方案:https://www.cocoacontrols.com/controls/jtgesturebasedtableviewdemo

答案 1 :(得分:0)

这是一些实际可行的代码(经过测试)。 把它放入 -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath方法,并注释掉其他代码以进行测试

CGRect cellFrame = cell.frame;

//replace with the y coordinate of the point, where the cell(s) get inserted
float insertPoint = 0;
//replace with the duration you wish
float animationDuration = 5;

[cell setFrame:CGRectMake(cellFrame.origin.x, insertPoint, cellFrame.size.width, 0)];
[UIView animateWithDuration:animationDuration animations:^{
    [cell setFrame:cellFrame];
}];

这可能不是你想要的,但它应该给你一个想法......