iOS 动画块手势识别器

Posted

技术标签:

【中文标题】iOS 动画块手势识别器【英文标题】:iOS Animation Block Gesture Recognizer 【发布时间】:2013-05-06 07:29:38 【问题描述】:

我有一个 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

【问题讨论】:

【参考方案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];   ]; 

【讨论】:

感谢您的建议。刚刚试了一下,结果是一样的。动画有效,但手势识别器的问题仍然存在。不过感谢您的想法。 你也可以尝试一种方法 performSelector:withBlock:afterDelay:【参考方案2】:

在 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())

【讨论】:

以上是关于iOS 动画块手势识别器的主要内容,如果未能解决你的问题,请参考以下文章

ios uiimageview点击手势在动画期间不起作用

关于 NSClassFromString / 检查手势识别器的困惑

iOS:UIImageView 不响应动画之间的点击手势

iOS 手势识别器概述

快速推迟手势识别器(UISwipeGestureRecognizer)

iOS开发之手势识别汇总