带有附件和推送行为的 UIDynamicKit 会导致较长的振荡时间
Posted
技术标签:
【中文标题】带有附件和推送行为的 UIDynamicKit 会导致较长的振荡时间【英文标题】:UIDynamicKit with attachment and push behaviour causes long oscillation time 【发布时间】:2014-01-30 15:03:27 【问题描述】:我刚刚开始使用 UIDynamic 工具包,并在网上遵循了示例。我已经实现了我想要的行为,即视图接收到一个方向的瞬时力并弹回原点。
我使用下面的代码实现了这一点
CGPoint origCenter = self.viewContentContainer.center;
self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
UIPushBehavior *push = [[UIPushBehavior alloc]
initWithItems:@[self.viewContentContainer] mode:UIPushBehaviorModeInstantaneous];
CGVector vector = CGVectorMake(200.0, 0.0);
push.pushDirection = vector;
CGPoint anchorpoint = origCenter;
UIAttachmentBehavior *attachment = [[UIAttachmentBehavior alloc] initWithItem:self.viewContentContainer attachedToAnchor:anchorpoint];
[attachment setFrequency:2.0];
[attachment setDamping:0.5];
[self.animator addBehavior:push];
[self.animator addBehavior:attachment];
但是,它最终会在 1 或 2 个像素范围内振荡很长时间。改变频率和阻尼值似乎并没有使这变得更好或更糟。
有其他人经历过吗?
非常感谢。
【问题讨论】:
【参考方案1】:添加它,它应该可以修复它:
attachment.length = 1.0f;
这是一种预期的行为,尽管它看起来“难看”。以上只是抵消了“不美观”。
经过测试。希望对您有所帮助。
【讨论】:
我有这个问题,1.0 的长度一开始似乎确实会延迟振荡,但不会永远。最终,经过足够多的运动后,视图仍会摇摆不定。【参考方案2】:我也有同样的问题。还没解决,但我有一些想法 当 UIGestureRecognizer 结束时,我删除了附件行为, 但是当我拖动它时它仍然会摆动:(
-(void) handlePanGestureRecognizer:(UIPanGestureRecognizer*) gr
CGPoint att = [gr locationInView:self.view];
self.attachView.center = att;
if (gr.state == UIGestureRecognizerStateBegan)
_attachment.anchorPoint = att;
[_animator addBehavior:_attachment];
if (_snap)
[_animator removeBehavior:_snap];
if (gr.state == UIGestureRecognizerStateChanged)
_attachment.anchorPoint = att;
if (gr.state == UIGestureRecognizerStateEnded)
_snap = [[UISnapBehavior alloc] initWithItem:self.button snapToPoint:att];
[_animator addBehavior:_snap];
[_animator removeBehavior:_attachment];
这不是很好的解决方案,但它可以按我喜欢的方式工作
-(void) handlePanGestureRecognizer:(UIPanGestureRecognizer*) gr
CGPoint att = [gr locationInView:self.view];
self.attachView.center = att;
if (_snap)
[_animator removeBehavior:_snap];
_snap = [[UISnapBehavior alloc] initWithItem:self.button snapToPoint:att];
[_animator addBehavior:_snap];
【讨论】:
【参考方案3】:我解决这些振荡的方法是使用 animator.removeBehavior() 完全删除行为,然后将相同的行为重新添加回动画师。
【讨论】:
【参考方案4】:添加此行为:
dynamic = UIDynamicItemBehavior()
dynamic.resistance = 1
self.animator.addBehavior(dynamic)
【讨论】:
以上是关于带有附件和推送行为的 UIDynamicKit 会导致较长的振荡时间的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在 UIDynamicKit 中模拟对象/ UIView 的重力?