まず、アニメーターをローカル変数としてだけでなく、プロパティとして定義してください (キーワード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];