我正在尝试在具有许多元素的 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
子类,它们都是滚动子类的。
首先,确保将动画器定义为一个属性,而不仅仅是一个局部变量(我倾向于使用 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/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |