iOS动画块手势识别器

时间:2013-05-06 07:29:38

标签: ios animation uigesturerecognizer uicollectionview

我有一个UICollectionView,其中包含许多包含视图的单元格,这些视图可以从集合视图中拖放到集合视图之外的不同视图中。这个过程很好。但是,当拖动的视图被放入其新位置时,我想通过将拖动视图缩放到其完整大小然后回到零来为放置设置动画,然后将其从超视图中移除。当我拖动其他对象时,这适用于应用程序的其他区域,但这是唯一涉及集合视图的区域。

[UIView animateWithDuration:0.375
                 animations:^{ dragView.transform = CGAffineTransformMakeScale (1.0f, 1.0f); dragView.transform = CGAffineTransformMakeScale(0.0f, 0.0f); }
                 completion:^(BOOL finished) {  [dragView removeFromSuperview]; }  ];   

如果我不使用完成块,动画将失败,大概是因为视图在动画结束前被删除。但是如果我使用完成块,当动画完成时,后续的平移手势(用于滚动集合视图)将被传递到我的视图控制器中用于其他事物的平移手势识别器,而不是用于滚动集合视图。因此,集合视图在动画后显示为“已锁定”。如果我删除完成块,之后不会出现手势识别问题,但动画也不起作用。

我在动画后尝试在集合视图上设置userInteractionEnabled = YES,但它没有帮助。

有什么建议吗? TIA

2 个答案:

答案 0 :(得分:1)

omg,你对同一类型的2个同步动画有什么期望?也许这是一个解决方案?

第一个动画电话:

[UIView animateWithDuration:0.375
                 animations:^{ dragView.transform = CGAffineTransformMakeScale (1.0f, 1.0f); }
                 completion:^(BOOL finished) {  /*call the second animation*/ }  ];

第二次动画电话:

//second animation
[UIView animateWithDuration:0.375
                 animations:^{ dragView.transform = CGAffineTransformMakeScale(0.0f, 0.0f); }
                 completion:^(BOOL finished) {  [dragView removeFromSuperview]; }  ]; 

答案 1 :(得分:0)

在 Swift 5.0、iOS 13+ 中,将 .allowUserInteraction 添加到动画选项中,然后动画不会阻止手势识别器。

UIView.animate(
withDuration: 0.375,
delay: 0,
options: [.curveEaseOut, .allowUserInteraction],
animations: {
    dragView.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
    dragView.transform = CGAffineTransform(scaleX: 0.0, y: 0.0)
},
completion: {_ in dragView.removeFromSuperview()})