我正在尝试在具有许多元素的 scrollView 上实现 UIDynamicAnimator 效果。我在任何地方都找不到太多关于它的信息,所以我只需要一些起点。
所以我有我的 scrollView ,其中包含许多 UIViews 。我想在滚动时为其“ subview ”制作任何类型的动画。
试过了-什么也没发生。
//DYNAMICS ANIMATIONS
UIDynamicAnimator *dynamic=[[UIDynamicAnimator alloc] initWithReferenceView:scroller];
UIGravityBehavior *gravityBeahvior = [[UIGravityBehavior alloc] initWithItems:mainCellsArray];
[dynamic addBehavior:gravityBeahvior];
当 mainCellsArray 持有滚动条的所有“ subview ”时。
编辑:
我对 dynamic 有一个强大的 property 。
该数组包含我的服装类指针,每个类都是 UIView 子类,它们都是滚动子类的。
Best Answer-推荐答案 strong>
首先,确保将动画器定义为一个属性,而不仅仅是一个局部变量(我倾向于使用 animator 作为名称,以避免与 @ 混淆动态 关键字):
@property (strong, nonatomic) UIDynamicAnimator *animator;
然后实例化动画师:
self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.scrollView];
并添加重力:
UIGravityBehavior *gravityBehavior = [[UIGravityBehavior alloc] initWithItems[viewToAnimate]];
[self.animator addBehavior:gravityBehavior];
如果您希望它们在到达 ScrollView 的 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];
或者,如果您希望它们飞离 ScrollView ,您可能希望在它们不再与 ScrollView 的 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];
关于ios - 在 ScrollView 上使用 UIDynamicAnimator?,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/23738628/
|