Ios 处理多个单元格选择和自定义转换

Ios 处理多个单元格选择和自定义转换,ios,uitableview,uicollectionview,uiviewanimation,uicollectionviewcell,Ios,Uitableview,Uicollectionview,Uiviewanimation,Uicollectionviewcell,在本例中,我们使用UICollectionView,但同样的问题也适用于UITableView方法 选择“集合视图”单元时,该单元上有一个自定义动画。它为单元格设置动画,然后我们有一个UIViewControllerTransitioningDelegate 在这个方法中,我们有一些自定义动画代码,一旦动画完成,我们就会触发segue,这是一个自定义转换 发行 问题是,当您快速选择两个单元格时,两个单元格都会出现动画,然后会弄乱过渡/导航栏 在这种情况下,处理一次只发生一个动画的最佳方法是什么?

在本例中,我们使用UICollectionView,但同样的问题也适用于UITableView方法

选择“集合视图”单元时,该单元上有一个自定义动画。它为单元格设置动画,然后我们有一个UIViewControllerTransitioningDelegate

在这个方法中,我们有一些自定义动画代码,一旦动画完成,我们就会触发segue,这是一个自定义转换

发行 问题是,当您快速选择两个单元格时,两个单元格都会出现动画,然后会弄乱过渡/导航栏


在这种情况下,处理一次只发生一个动画的最佳方法是什么?禁用mutli select不会改变任何东西,因为理论上我们不是选择多个,只是快速地逐个选择。

在didSelectItemAtIndexPath中将集合视图的AllowSelection属性设置为“否”;这将阻止用户选择第二个单元格。如果稍后要从要进入的控制器返回到同一集合视图,则可以在ViewDidDisplay中将其设置为“是”

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
        if (self.cellAnimationInProgress == YES) {
            return;
        }

        dispatch_async(dispatch_get_main_queue(), ^(void) {
            //Code here is run on the main thread
            self.cellAnimationInProgress = YES;
        });

我使用了与上述建议类似的方法。在动画输出期间,我保留一个BOOL并更新为YES。然后,在完成后返回并设置动画时,BOOL将更新回NO,因此第二次点击将被忽略。

谢谢,我最初尝试过,但它对我不起作用。可能是因为它没有在主线程上调用。最后,我只是添加了一个BOOL,在设置动画时更新它,在返回控制器并设置动画时返回NO。我想这是最好的办法,对吧?@StuartM,我不知道这是不是最好的办法。如果将AllowSelection设置为NO作为didSelectItemAtIndexPath中的第一行,则应在主线程上调用它。不知道你尝试了什么,很难进一步评论。
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
        if (self.cellAnimationInProgress == YES) {
            return;
        }

        dispatch_async(dispatch_get_main_queue(), ^(void) {
            //Code here is run on the main thread
            self.cellAnimationInProgress = YES;
        });