2

多くの要素を持つ にUIDynamicAnimatorエフェクトを実装しようとし ています。scrollViewどこにもそれに関する情報があまり見つからなかったので、出発点が必要です。

だから私は私scrollViewの を持っUIViewsています。スクロール中に「サブビュー」に任意の種類のアニメーションを作成したい。

試してみましたが、何も起こりません。

  //DYNAMICS ANIMATIONS
    UIDynamicAnimator *dynamic=[[UIDynamicAnimator alloc] initWithReferenceView:scroller];
    UIGravityBehavior *gravityBeahvior = [[UIGravityBehavior alloc] initWithItems:mainCellsArray];
    [dynamic addBehavior:gravityBeahvior];

mainCellsArrayスクローラーのすべての「サブビュー」を保持する場合。

編集:私propertydynamic. 配列には、各クラスがUIViewサブクラスであり、すべてのスクローラーの子のコスチューム クラス ポインターが保持されます。

4

1 に答える 1

2

まず、アニメーターをローカル変数としてだけでなく、プロパティとして定義してください (キーワードanimatorとの混同を避けるために、私はその名前に使用する傾向があります):@dynamic

@property (strong, nonatomic) UIDynamicAnimator *animator;

次に、アニメーターをインスタンス化します。

self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.scrollView];

そして重力を追加します:

UIGravityBehavior *gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[viewToAnimate]];
[self.animator addBehavior:gravityBehavior];

スクロール ビューの一番下に達したときに停止させたい場合は、通常の設定contentSizeは使用できません。translatesReferenceBoundsIntoBoundaryたとえば、次のようなパスを自分で作成する必要があります。

UICollisionBehavior *collision = [[UICollisionBehavior alloc] initWithItems:@[viewToAnimate]];
CGRect contentSizeRect = {CGPointZero, self.scrollView.contentSize};
UIBezierPath *path = [UIBezierPath bezierPathWithRect:contentSizeRect];
[collision addBoundaryWithIdentifier:@"contentSize" forPath:path];
[self.animator addBehavior:collision];

または、それらをスクロール ビューの外に飛ばしたい場合はcontentSize、スクロール ビューの と交差しなくなったときにそれらを削除することをお勧めします。

UIGravityBehavior *gravity = [[UIGravityBehavior alloc] initWithItems:@[viewToAnimate]];
UIGravityBehavior __weak *weakGravity = gravity;
CGRect contentSizeRect = {CGPointZero, self.scrollView.contentSize};
gravity.action = ^{
    if (!CGRectIntersectsRect(contentSizeRect, viewToAnimate.frame)) {
        NSLog(@"removing view");
        [viewToAnimate removeFromSuperview];
        [self.animator removeBehavior:weakGravity];
    }
};
[self.animator addBehavior:gravity];
于 2014-05-19T14:30:50.740 に答える