UITableviewcell动画只有一次

时间:2016-10-23 12:51:41

标签: ios objective-c uitableview animation

这是我想要动画一次的willDisplayCell动画代码,在向上滚动桌面视图时不要重复。

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{

    UIView *cellContentView = [cell contentView];
    CGFloat rotationAngleDegrees = -30;
    CGFloat rotationAngleRadians = rotationAngleDegrees * (M_PI/180);
    CGPoint offsetPositioning = CGPointMake(0, cell.contentView.frame.size.height*4);
    CATransform3D transform = CATransform3DIdentity;
    transform = CATransform3DRotate(transform, rotationAngleRadians, -50.0, 0.0, 1.0);
    transform = CATransform3DTranslate(transform, offsetPositioning.x, offsetPositioning.y, -50.0);
    cellContentView.layer.transform = transform;
    cellContentView.layer.opacity = 0.8;

    [UIView animateWithDuration:0.95 delay:00 usingSpringWithDamping:0.85 initialSpringVelocity:0.8 options:0 animations:^{
        cellContentView.layer.transform = CATransform3DIdentity;
        cellContentView.layer.opacity = 1;
    } completion:^(BOOL finished) {}];

    }

2 个答案:

答案 0 :(得分:2)

如果您希望任何代码只运行一次,则可以使用dipatch_once。这将确保此代码仅在父对象的生命周期中运行一次。如果该代码是从tableview的事件处理程序以外的其他地方运行的,那么您可以将该代码放在dispatch_async中。

dispatch_async(dispatch_get_main_queue(),^{
    static dispatch_once_t once;
    dispatch_once(&once, ^{
           //Your animation code.
    });
};

答案 1 :(得分:0)

为了让每个单元格动画一次,每个单元格必须知道它自己动画,并且它不应该再次。实现这一目标的最简单方法是给出名为BOOL的单元格animated变量,以确定单元格是否已经设置了动画。

创建自定义单元格类

创建新的Cocoa类,例如CustomCell。它应该是UITableViewCell

的子类

CustomCell.h内部声明一个名为animated的BOOL属性:

@property (nonatomic) BOOL animated;

如果您使用像我这样的故事板,请记住还要在故事板编辑器中更新单元格的类,就像在创建新的视图控制器时一样

这就是它。

修改视图控制器

现在你应该导入你的新类并在tableViews委托方法中用(UITableViewCell *)交换(CustomCell *)

willDisplayCell:中添加必要的逻辑,它将如下所示:

-(void)tableView:(UITableView *)tableView willDisplayCell:(CustomCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{

    if(!cell.animated){ //added

        cell.animated = YES;  //added    

        UIView *cellContentView = [cell contentView];
        CGFloat rotationAngleDegrees = -30;
        CGFloat rotationAngleRadians = rotationAngleDegrees * (M_PI/180);
        CGPoint offsetPositioning = CGPointMake(0, cell.contentView.frame.size.height*4);
        CATransform3D transform = CATransform3DIdentity;
        transform = CATransform3DRotate(transform, rotationAngleRadians, -50.0, 0.0, 1.0);
        transform = CATransform3DTranslate(transform, offsetPositioning.x, offsetPositioning.y, -50.0);
        cellContentView.layer.transform = transform;
        cellContentView.layer.opacity = 0.8;

        [UIView animateWithDuration:0.95 delay:00 usingSpringWithDamping:0.85 initialSpringVelocity:0.8 options:0 animations:^{
            cellContentView.layer.transform = CATransform3DIdentity;
            cellContentView.layer.opacity = 1;
        } completion:^(BOOL finished) {}];

    }

就是这样。希望它适合你