Swift 4 in Xcode 9 - 如何在拖动 UItextview 期间做一些动画
Swift 4 in Xcode 9 - How to do some animation during dragging UItextview
我在UItextview上面的view中做了一个动画,看起来很流畅。我用了一个定时器来做这个动画。
但是有一个问题,当我拖动textview的时候,动画还没有结束就可以暂停。那么,有没有什么办法可以让动画随着textview的滚动或拖动流畅播放呢
好的,我尽量说清楚。
我的英语不好,请原谅。
一个UItextview,可以滚动。另一个视图上的按钮(这个视图与那个 UItextview 没有关联)。那两个视图同时在一个大视图中。触摸时按钮变大,此过程关注文本视图滚动时的animation.But,如果动画开始但尚未结束,则可以暂停该动画。
当按钮被触摸时调用的函数,这个动画是一个定时器,它在每一帧的数组中的位置。
以及如何详细暂停动画:
用手指触摸这个按钮,可以触发它的动画。在这个动画结束之前,用另一个手指拖动textview,我可以发现这个动画明显暂停了,当我在textview中抬起手指时它继续。
那么,为什么当文本视图(或滚动视图)滚动时所有动画都暂停了。这是系统程序吗?如何解决这个问题?
如有其他疑问,请在评论区提出问题。
这个动画是这样的:
var TimerCount = 0
var timer = timer()
timer = timer.scheduledTimer(withTimeInterval: 0.02, repeats: true, block: { (timer) in
/*Some animation code*/
if TimerCount >= 19 {
timer.invalidate()
}
TimerCount += 1
})
虽然 "pausing" 问题可以在您的代码中解决,但我必须郑重声明,这不是执行动画的正确方法。
我建议您看一下 CABasicAnimation 和 CoreAnimation 框架方法,以利用 GPU 正确执行动画。
Ray Wenderlich 一如既往地对这个主题做出惊人的 tutorial。
所以说,暂停的发生是因为定时器是使用schedule方法调度的。您必须将计时器添加到主运行循环中,以避免被用户操作打断。同样,这不是在 iOS 上为屏幕上的内容设置动画的正确方法,很可能您会遇到性能问题。
var timerCount = 0
let timer = Timer(timeInterval: 0.02, repeats: true) { (timer) in
/*Some animation code*/
if TimerCount >= 19 {
timer.invalidate()
}
timerCount += 1
}
RunLoop.main.add(timer, forMode: .commonModes)
虽然此代码为您提供了解决方案,但我强烈建议不要以这种方式执行动画。它有效,最终你会得到你想要的,但将来你可能会遇到问题。
我在UItextview上面的view中做了一个动画,看起来很流畅。我用了一个定时器来做这个动画。
但是有一个问题,当我拖动textview的时候,动画还没有结束就可以暂停。那么,有没有什么办法可以让动画随着textview的滚动或拖动流畅播放呢
好的,我尽量说清楚。 我的英语不好,请原谅。
一个UItextview,可以滚动。另一个视图上的按钮(这个视图与那个 UItextview 没有关联)。那两个视图同时在一个大视图中。触摸时按钮变大,此过程关注文本视图滚动时的animation.But,如果动画开始但尚未结束,则可以暂停该动画。
当按钮被触摸时调用的函数,这个动画是一个定时器,它在每一帧的数组中的位置。
以及如何详细暂停动画:
用手指触摸这个按钮,可以触发它的动画。在这个动画结束之前,用另一个手指拖动textview,我可以发现这个动画明显暂停了,当我在textview中抬起手指时它继续。
那么,为什么当文本视图(或滚动视图)滚动时所有动画都暂停了。这是系统程序吗?如何解决这个问题?
如有其他疑问,请在评论区提出问题。
这个动画是这样的:
var TimerCount = 0
var timer = timer()
timer = timer.scheduledTimer(withTimeInterval: 0.02, repeats: true, block: { (timer) in
/*Some animation code*/
if TimerCount >= 19 {
timer.invalidate()
}
TimerCount += 1
})
虽然 "pausing" 问题可以在您的代码中解决,但我必须郑重声明,这不是执行动画的正确方法。
我建议您看一下 CABasicAnimation 和 CoreAnimation 框架方法,以利用 GPU 正确执行动画。
Ray Wenderlich 一如既往地对这个主题做出惊人的 tutorial。
所以说,暂停的发生是因为定时器是使用schedule方法调度的。您必须将计时器添加到主运行循环中,以避免被用户操作打断。同样,这不是在 iOS 上为屏幕上的内容设置动画的正确方法,很可能您会遇到性能问题。
var timerCount = 0
let timer = Timer(timeInterval: 0.02, repeats: true) { (timer) in
/*Some animation code*/
if TimerCount >= 19 {
timer.invalidate()
}
timerCount += 1
}
RunLoop.main.add(timer, forMode: .commonModes)
虽然此代码为您提供了解决方案,但我强烈建议不要以这种方式执行动画。它有效,最终你会得到你想要的,但将来你可能会遇到问题。