0

https://github.com/DuncanMC/iOS-CAAnimation-group-demoから以下のコードを見つけました 。この特定のメソッドにより、ユーザーはジェスチャ認識機能を使用してコア アニメーション シーケンスで「飛行中」の UIView を停止できます。ビューがタップされると、アニメーションが停止します。示されているように、このコードはアニメーション ビューでのみ機能します。多くのアニメーション ビューがあり、いずれかのビューを操作する必要があります。ビュー (またはレイヤー) の配列を設定し、それらを循環する必要があると思います。これは正しいです?どうすればこれを行うことができますか?ありがとう!

  /*
 This method gets called from a tap gesture recognizer installed on the view myContainerView.
 We get the coordinates of the tap from the gesture recognizer and use it to hit-test
 myContainerView.layer.presentationLayer to see if the user tapped on the moving image view's
(presentation) layer. The presentation layer's properties are updated as the animation runs, so hit-testing
the presentation layer lets you do tap and/or collision tests on the "in flight"   animation.
*/

- (IBAction)testViewTapped:(id)sender
{
  CALayer *tappedLayer;
  id layerDelegate;
  UITapGestureRecognizer *theTapper = (UITapGestureRecognizer *)sender;
  CGPoint touchPoint = [theTapper locationInView: myContainerView];
  if (animationInFlight)
 {
    tappedLayer = [myContainerView.layer.presentationLayer hitTest: touchPoint];
    layerDelegate = [tappedLayer delegate];

    if (((layerDelegate == imageOne && !doingMaskAnimation)) ||
      (layerDelegate == waretoLogoLarge && doingMaskAnimation))
    {
      if (myContainerView.layer.speed == 0)
        [self resumeLayer: myContainerView.layer];
      else
     {
        [self pauseLayer: myContainerView.layer];

    //Also kill all the pending label changes that we set up using performSelector:withObject:afterDelay
    [NSObject cancelPreviousPerformRequestsWithTarget: animationStepLabel];
      }
    }
  }
}
4

1 に答える 1

0

笑。そのデモ プロジェクトは私のものです。コードは、タップされたレイヤーを見つけて、UIView をサポートするレイヤーの場合、レイヤーのデリゲートがビュー自体であるという事実を使用するように記述されています。

コード内で layerDelegate を見つけた時点で、それが IsKindOfClass UIView であることを確認してから、適切な方法を使用してビューをアニメーション化したビューと一致させます。IBOutletCollection を使用して、アニメーション化しているビューを追跡したり、可変配列を手動で作成してビュー オブジェクトを追加したり、ビュー タグを使用したり、アプリケーションに適したものを使用したりできます。

于 2013-04-04T00:45:22.877 に答える