UIViewのbeginAnimationsでなく、仕事の罰金:アニメーション中のUIScrollViewのタッチイベントがanimateWithDurationで発射ません。

StackOverflow https://stackoverflow.com/questions/3614116

質問

私は、プログラムの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    
    }
)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top