Ios 在从UICollectionView中删除单元格之前,将在项目之后删除动画
我已经构建了一个集合视图控制器,它可以通过Ios 在从UICollectionView中删除单元格之前,将在项目之后删除动画,ios,objective-c,uicollectionview,core-animation,nsfetchedresultscontroller,Ios,Objective C,Uicollectionview,Core Animation,Nsfetchedresultscontroller,我已经构建了一个集合视图控制器,它可以通过NSFetchResultsController进行更新 当控制器设置为编辑时,我在集合视图中摆动项目单元格,以突出显示用户处于不同的模式,因此当他们点击项目时,应该预期删除行为 问题是当我开始编辑并删除一个项目时,删除的单元格后的所有其他项目都会停止动画 如果你看上面的gif,你会看到我开始编辑,所有的项目都在抖动。当我删除第3项时,该项(4、5、6等)下方的所有项停止抖动,而其上方的所有单元格(0、1)保持抖动。我的猜测是,问题在于苹果公司实施了删
NSFetchResultsController
进行更新
当控制器设置为编辑时,我在集合视图中摆动项目单元格,以突出显示用户处于不同的模式,因此当他们点击项目时,应该预期删除行为
问题是当我开始编辑并删除一个项目时,删除的单元格后的所有其他项目都会停止动画
如果你看上面的gif,你会看到我开始编辑,所有的项目都在抖动。当我删除第3项时,该项(4、5、6等)下方的所有项停止抖动,而其上方的所有单元格(0、1)保持抖动。我的猜测是,问题在于苹果公司实施了删除动画,删除了所有动画,但我希望不会
可以在SQKFetchedCollectionViewController功能分支中找到所有源。克隆repo后,必须从项目文件夹运行pod安装。打开工作区,您可以在示例目标中找到
sqkcommitscolectionviewcontroller
,然后找到在Pods目标中作为开发pod提供数据的代码 多亏了@ian macdonald,我调查了使用CAAnimation
而不是[UIView animateWith
选项
旧方法
使用集合视图的删除动画的新填充方法
- (void)startWiggleing
{
CAKeyframeAnimation *position = [CAKeyframeAnimation animation];
position.keyPath = @"position";
position.values = @[
[NSValue valueWithCGPoint:CGPointZero],
[NSValue valueWithCGPoint:CGPointMake(-1, 0)],
[NSValue valueWithCGPoint:CGPointMake(1, 0)],
[NSValue valueWithCGPoint:CGPointMake(-1, 1)],
[NSValue valueWithCGPoint:CGPointMake(1, -1)],
[NSValue valueWithCGPoint:CGPointZero]
];
position.timingFunctions = @[
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut],
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]
];
position.additive = YES;
CAKeyframeAnimation *rotation = [CAKeyframeAnimation animation];
rotation.keyPath = @"transform.rotation";
rotation.values = @[
@0,
@0.03,
@0,
[NSNumber numberWithFloat:-0.02]
];
rotation.timingFunctions = @[
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut],
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]
];
CAAnimationGroup *group = [[CAAnimationGroup alloc] init];
group.animations = @[position, rotation];
group.duration = 0.4;
group.repeatCount = HUGE_VALF;
[self.layer addAnimation:group forKey:@"wiggle"];
}
要通读的代码太多了,所以我不打算这么做。不过,我会提供一些建议。您应该研究创建自己的动画关键点,并在其处于活动状态时晃动项目。这样,集合视图将单元格移动到新位置所施加的动画不会取消您的动画。
- (void)startWiggleing
{
CAKeyframeAnimation *position = [CAKeyframeAnimation animation];
position.keyPath = @"position";
position.values = @[
[NSValue valueWithCGPoint:CGPointZero],
[NSValue valueWithCGPoint:CGPointMake(-1, 0)],
[NSValue valueWithCGPoint:CGPointMake(1, 0)],
[NSValue valueWithCGPoint:CGPointMake(-1, 1)],
[NSValue valueWithCGPoint:CGPointMake(1, -1)],
[NSValue valueWithCGPoint:CGPointZero]
];
position.timingFunctions = @[
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut],
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]
];
position.additive = YES;
CAKeyframeAnimation *rotation = [CAKeyframeAnimation animation];
rotation.keyPath = @"transform.rotation";
rotation.values = @[
@0,
@0.03,
@0,
[NSNumber numberWithFloat:-0.02]
];
rotation.timingFunctions = @[
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut],
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]
];
CAAnimationGroup *group = [[CAAnimationGroup alloc] init];
group.animations = @[position, rotation];
group.duration = 0.4;
group.repeatCount = HUGE_VALF;
[self.layer addAnimation:group forKey:@"wiggle"];
}