【发布时间】:2018-03-29 22:34:27
【问题描述】:
我有一个集合视图,其中包含带有图像视图的单元格。当用户按下图像视图(使用 touchesBegan)时触发一个动画,当用户释放时触发另一个动画(使用 touchesEnded)。
只有当我按住点击然后松开(延迟点击)时,动画才能完美运行,但是当我快速点击时,动画会像持续时间设置为 0 一样跳跃。
我相信这个问题是因为集合视图是滚动视图的子类,并且 scrollViews “通过启动计时器临时拦截触摸事件,并在计时器触发之前查看触摸手指是否有任何移动。如果计时器在位置没有明显变化的情况下触发,滚动视图将跟踪事件发送到内容视图的触摸子视图。”
https://developer.apple.com/documentation/uikit/uiscrollview#//apple_ref/doc/uid/TP40006922
据我所知,如果点击比触摸计时器快,我认为来自集合视图的触摸拦截会导致动画出现问题。当我使用常规视图而不是集合视图作为超级视图进行测试时,动画效果很好,不需要延迟点击。
如果是这种情况,那么动画是如何触发快速点击的呢?此外,我如何能够在不使用延迟点击的情况下触发动画?
如果不是这样,那么这个问题的原因可能是什么?
这是我的动画和触摸代码:
func animateClickerAndBallPoint(newXpositionForClicker: CGFloat, newXpositionForBallPoint: CGFloat, ballPoint: UIImageView) {
UIView.animate(withDuration: 0.1) {
self.frame.origin.x = newXpositionForClicker
ballPoint.frame.origin.x = newXpositionForBallPoint
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let ballPoint = self.ballPoint else {return}
self.animateClickerAndBallPoint(newXpositionForClicker: 288, newXpositionForBallPoint: 11, ballPoint: ballPoint)
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let ballPoint = self.ballPoint else {return}
if isInWritingMode == true {
animateClickerAndBallPoint(newXpositionForClicker: 306, newXpositionForBallPoint: 26, ballPoint: ballPoint)
isInWritingMode = false
} else {
animateClickerAndBallPoint(newXpositionForClicker: 297, newXpositionForBallPoint: 17, ballPoint: ballPoint)
isInWritingMode = true
}
}
【问题讨论】:
-
没有看到你的代码,所有可以做的就是推测。您能否包含一些代码来显示您的动画、touchesBegan 和任何其他相关代码?
-
@Rob 感谢您的建议,但我不认为 didHighlight 方法是我的最佳选择,主要是因为与其内部的单元格相比,要触摸的 imageView 非常小。
标签: ios swift uiview uicollectionview uiviewanimation