3

我刚刚开始使用 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 个像素上振荡很长时间。改变频率和阻尼值似乎并没有使这变得更好或更糟。

有没有其他人经历过这个?

非常感谢。

4

4 回答 4

2

添加这个,它应该修复它:

attachment.length = 1.0f;

这是一种预期的行为,尽管它看起来“难看”。以上只是抵消了“不雅观”。

经测试。希望能帮助到你。

于 2014-01-30T17:16:53.113 回答
0

我也有同样的问题。还没有解决它,但是我有一些想法,当 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];
}
于 2014-03-11T11:25:35.177 回答
0

我解决这些振荡的方法是完全删除行为,使用 animator.removeBehavior() 然后将相同的行为重新添加回动画师。

于 2016-01-22T04:39:09.827 回答
0

添加此行为:

    dynamic = UIDynamicItemBehavior()
    dynamic.resistance = 1
    self.animator.addBehavior(dynamic)
于 2017-10-09T13:51:00.970 回答