2

我正在尝试对 具有许多元素的 a 实现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 定义为一个属性,而不仅仅是一个局部变量(我倾向于使用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 回答