0

通常の UIView クラス メソッドを使用して、いくつかのものをアニメーション化しようとしています。これらのアニメーション メソッドは、人気のあるiCarouselライブラリによって呼び出されるメソッドで呼び出しています。カルーセルをスクロールすると、アニメーションはすぐに完了状態になり、完了関数を呼び出します (アニメーションの期間は無視されます)。BOOL が true であるため、finishedアニメーションが中断されているようには見えません。

iCarousel のデリゲート メソッドの外部でこれらのアニメーションをトリガーすると、動作します。私は iCarousel を修正するつもりはありませんし、何かが壊れているとは思いません。内部のどのコードがアニメーションをすぐに完了させる可能性があるのか​​ 、さらに興味があります。そして、問題を回避するために私ができること。

次に例を示します。

- (void)carouselCurrentItemIndexDidChange:(iCarousel *)carousel {
    [UIView
     animateWithDuration:5.0f
     delay:0
     options:
        UIViewAnimationOptionCurveEaseOut |
        UIViewAnimationOptionOverrideInheritedDuration |
        UIViewAnimationOptionOverrideInheritedCurve
     animations:^{
        myView.alpha = 0;
     }
     completion:^(BOOL finished){
         NSLog(@"Completed. Did it finish? %i", finished);
     }];
}

最後の詳細:
iCarousel のドキュメントには、カルーセルの useDisplayLink プロパティを変更して、アニメーションとの競合を回避できることが記載されています。これは何の違いもないようです。

助けてくれてありがとう!

4

1 に答える 1

2

iCarousel のソースの奥深くで問題を発見しました。ライブラリ内で何らかの理由で、を使用してアニメーションを無効[CATransaction setDisableActions:YES];にし、後でさまざまな場所で再度有効にします。そのような場所の 1 つが、一連のコールバックにまたがっているため、アニメーションが適切に起動されません。

iCarousel のコードから判断すると、これは非常に意図的なものなので、自分のコードでこの問題を回避する必要があると思います。

編集:この問題を回避する更新されたコードは次のとおりです。

- (void)carouselDidEndScrollingAnimation:(iCarousel *)carousel {
    BOOL previousDisableActions = [CATransaction disableActions];
    [CATransaction setDisableActions:NO];

    // Begin animation here.

    [CATransaction setDisableActions:previousDisableActions];
}

更新: iCarousel の作成者は、上記で提案した各デリゲート呼び出しの周りにコードを内部的に追加することで、このバグを修正しました。これは永久に修正されたようです。

于 2012-07-22T19:01:08.873 に答える