私は、UITouchイベントから描画ハンドラに記録された一連のポイントを再生しようとしています。最後の1秒後に0.1秒後に各点を描きたい。いったんCGPointの配列を取得すると、配列を反復処理し、GDCのdispatchAfterをキューに入れ、その点で描画メソッドを呼び出します。複数のasyncAfterを互いに対してキューする - Swift 3
override func replay(_ queue: DispatchQueue) {
isReplaying = true
for stroke in strokeHistory {
var additionalTime = 0.0
for curPoint in stroke.points {
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + additionalTime, execute: {
[unowned self, s = stroke, lrp = stroke.lastReplayPoint] in
s.lastReplayPoint = lrp
switch curPoint.state {
case .began:
self.strokeBegan(s, atPoint: curPoint)
case .changed:
self.strokeMoved(s, toPoint: curPoint)
case .ended:
self.strokeEnded(s, atPoint: curPoint)
default :
NSLog("Point phase default.")
}
})
additionalTime = additionalTime + 0.1
stroke.lastReplayPoint = curPoint
}
}
}
再生は機能しますが、徐々に速度が低下し、より遅い間隔と遅い間隔で大きなチャンクが描画されます。どのようにしてこれらの点を0.1秒間描画するようにキューに入れることができますか?
Iは、パス全体またはキャンバスを描画するたびに、バッファCGLayerその最小「汚れにだけ線分わけではありませんビューのdraw()CGContextに「rect」を追加します。私が複数のdispatchAftersをキューに入れずに配列の最初のポイントを取り出し、描画し、配列から削除し、配列までw/delayを繰り返すと、アニメーションは期待どおりに再生されます空です。 –
@TylerWhite - それはそれではない場合、それはおそらく本当に減速していないが、単にタイマを統合することです(これは将来別のタイマーをスケジュールする場合に起こります)、おおよそ同じ速度のアニメーションを生成し、あなたがさらに遠くになるにつれ、ますます吃音するように見えます。 (DispatchSource.TimerFlag.strict'の 'Flags'を使って' DispatchTimerSource'を使用して)合体をオプトアウトするか、別のタイマーではなく、単一の反復 'Timer'またはディスパッチタイマーを使用する方が簡単です。それは合体を防ぐでしょう。 – Rob
タイマーが合体するのはあなたのことでした。 –