UIViewのbeginAnimationsでなく、仕事の罰金:アニメーション中のUIScrollViewのタッチイベントがanimateWithDurationで発射ません。
-
26-09-2019 - |
質問
私は、プログラムのUIViewのアニメーションを使用してスクロールしていますことをUIScrollViewのサブクラスを持っています。
私はのアニメーションが行われている間。
スクロール表示ののUIImageViewコンテンツにタップするか、ズームできるようにするには、ユーザーが欲しいです これに処方似を使用しながら、これは罰金を働いています:
- (void) scrollSmoothlyatPixelsPerSecond:(float)thePixelsPerSecond {
// distance in pixels / speed in pixels per second
float animationDuration = _scrollView.contentSize.width / thePixelsPerSecond;
[UIView beginAnimations:@"scrollAnimation" context:nil];
[UIView setAnimationCurve: UIViewAnimationCurveLinear];
[UIView setAnimationDuration:animationDuration];
_scrollView.contentOffset = CGPointMake(_scrollView.contentSize.width, 0);
[UIView commitAnimations];
}
さて、iOSの4.0以降、UIViewのbeginAnimationsは:推奨されていません。スクロールは上記に同じように動作します:ブロックとのUIView animateWithDurationを使用して自分のコードを更新しようとした私はそう。
キーと腹立たしいの違いは、イベント処理メソッドへのアニメーションの間に、UIScrollViewを、その他のビューが無もはや応答:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
NORいます:
-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;
は、ズームしようとしたときに呼び出されます。
明確にするため、編集:いいえUIViewの存在に応答タッチイベントへ。これはちょうどUIScrollViewのに限定されるものではありません。 UIScrollViewののピアUIToolbarは、タッチイベントに応答しない、またUIScrollViewのにピアのサブビューある他のボタン操作を行います。アニメーションが
の上で起こっている間に全体親のUIViewは、ユーザーとの対話のアウト凍結されていることが表示されます。ここでも、アニメーションが完了した後、上記UIViewsのすべてが再び応答する。これらは、すべてのUIView beginAnimationsに呼び出されるのですか:製剤に関係なくアニメーション状態の
。マイanimateWithDuration:コードはわずかに異なっている - しかし、違いは重要ではありません。すぐにアニメーションが完了すると、上記のタッチイベントが再び...
と呼ばれていますここに私のアニメーションのコードです:
- (void) scrollSmoothlyToSyncPoint:(SyncPoint *) theSyncPoint andContinue:(BOOL)theContinueFlag{
float animationDuration = theSyncPoint.time - [player currentTime];
[UIView animateWithDuration:animationDuration
delay:0
options:UIViewAnimationOptionCurveLinear
animations:^{
[_scrollView setContentOffset:theSyncPoint.contentOffset];
}
completion:^(BOOL finished){
if (theContinueFlag) {
SyncPoint *aSyncPoint = [self nextSyncPoint];
if (aSyncPoint) {
[self scrollSmoothlyToSyncPoint:aSyncPoint andContinue:YES];
}
}
}];
}
上記アニメーションブロック中の火災であることのみイベントハンドラ
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
だから、質問:万一私は - Appleのの落胆のラベルを無視し、beginAnimation製剤を使い続けますか?万一I - hitTestを使用して再実装ズームと私の他のタッチベースのイベント?私はこの問題に直面することができますアニメーションブロック間の実装の違いのいくつかの知識はありますか?そこに何かが私が欠けていることは明らかですか?
私はアップルの新しい開発者です、と私は彼らのの落胆のタグを取る方法を真剣に知りません。このAPIが消え、その後廃止される場合、しかし、私はむしろ持続的な方向に動くと思います。
そんなにあなたの注意に感謝します。
解決
あなただけのUIViewAnimationOptionAllowUserInteractionオプションを含める必要が
[UIView animateWithDuration:animationDuration
delay:0
options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction)
<snip>];
卑劣な一つだ。つまり、私が知っています! ;)
日時:「落胆」タグ - 一般的に、Appleはあなたが彼らのプラットフォーム上で実行するには、それはあなた自身の利益のため、通常だとアプリケーションを設計する点で何かをしないように指示します。あなたは右の不格好な古い方法の代わりに、アニメーションのブロックを採用したいと思っているので。
他のヒント
quickthyme
の答えは正しいです。ここでスウィフトでスニペットがある
スイフト4
UIView.animate(
withDuration: 0.3, // specify animation duration here
delay: 0, // specify delay if needed
options: [
UIView.AnimationOptions.allowUserInteraction,
UIView.AnimationOptions.curveLinear
],
animations: {
// animations code
}
)