带有附件和推送行为的 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 的重力?

如何在 iOS 10 应用程序中将媒体附件添加到我的推送通知?

Django 邮件推送 解决附件中文名字乱码

ios 10推送通知媒体附件随机不起作用

更新推送通知徽章计数

微信公众号推送怎么添加附件