这是我想要动画一次的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) {}];
}
答案 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) {}];
}
就是这样。希望它适合你