iOS:UIDynamicMator UpdateTimeSingCurrentState不使用旋转

iOS:UIDynamicMator UpdateTimeSingCurrentState不使用旋转,ios,objective-c,ios7,uikit-dynamics,Ios,Objective C,Ios7,Uikit Dynamics,我试图在UIDynamics中手动更改视图的旋转,但视图的旋转总是在更新后重置。该方法表示,UIDynamicMator的UpdateTimeSingCurrentState:方法应更新项目的位置和旋转,但仅更新位置。 我创建了一个简短的示例,其中一个方形视图从屏幕上落下,触摸后,它应该定位到触摸的位置并旋转45度。但是,不会发生旋转(有时旋转会持续几秒钟,但之后会再次重置): (我把所有的代码都放在这里,这样你就可以把它复制粘贴到一个新创建的项目中。希望没有太多不相关的代码让它不安) 我做错什

我试图在
UIDynamics
中手动更改视图的旋转,但视图的旋转总是在更新后重置。该方法表示,
UIDynamicMator
UpdateTimeSingCurrentState:
方法应更新项目的位置和旋转,但仅更新位置。
我创建了一个简短的示例,其中一个方形视图从屏幕上落下,触摸后,它应该定位到触摸的位置并旋转45度。但是,不会发生旋转(有时旋转会持续几秒钟,但之后会再次重置):

(我把所有的代码都放在这里,这样你就可以把它复制粘贴到一个新创建的项目中。希望没有太多不相关的代码让它不安)


我做错什么了吗?或者不可能显式更改视图的旋转吗?

我的解决方案是从动画师中删除该行为,然后使用项目的修改状态重新创建该行为。明确设置项目的位置(通过
居中
)和旋转不是在UIDynamics影响下真正应该做的事情(比如在酒精的影响下,但更无聊)

我的解决方案的代码:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.animator removeBehavior:self.gravityBehavior];
    self.gravityBehavior = nil;

    UITouch *touch = touches.anyObject;
    CGPoint touchLocation = [touch locationInView:touch.view];

    self.square.center = touchLocation
    self.square.transform = CGAffineTransformMakeRotation(M_PI/4);

    self.gravityBehavior = [[UIGravityBehavior alloc] initWithItem:self.square];
    self.gravityBehavior.magnitude = 0.1f;

    [self.animator addBehavior:self.gravityBehavior];
}

我的解决方案是从动画师中删除该行为,然后使用项目的修改状态重新创建该行为。明确设置项目的位置(通过
居中
)和旋转不是在UIDynamics影响下真正应该做的事情(比如在酒精的影响下,但更无聊)

我的解决方案的代码:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.animator removeBehavior:self.gravityBehavior];
    self.gravityBehavior = nil;

    UITouch *touch = touches.anyObject;
    CGPoint touchLocation = [touch locationInView:touch.view];

    self.square.center = touchLocation
    self.square.transform = CGAffineTransformMakeRotation(M_PI/4);

    self.gravityBehavior = [[UIGravityBehavior alloc] initWithItem:self.square];
    self.gravityBehavior.magnitude = 0.1f;

    [self.animator addBehavior:self.gravityBehavior];
}

基于无限詹姆斯的回答,我找到了一个非常有效的解决方案。 因此,要更新项目的轮换,您需要
1.从动态动画师中删除影响项目的所有行为
2.更新项目的轮换
3.将删除的行为返回给动画师(无需创建新行为)

<强> >注释< /强>:您可以将所有行为添加到一个父行为作为子行为,这样您就可以立即删除和返回所有这些行为(但是这种态度阻止动态动画中的所有移动,所以您也应该考虑其他不那么有害的方式)。
此解决方案是一种折衷方案,因为它会停止项目的移动,因此如果您发现更好的解决方案,请添加您的答案…

基于Infinity James的答案,我找到了一个非常有效的解决方案。 因此,要更新项目的轮换,您需要
1.从动态动画师中删除影响项目的所有行为
2.更新项目的轮换
3.将删除的行为返回给动画师(无需创建新行为)

<强> >注释< /强>:您可以将所有行为添加到一个父行为作为子行为,这样您就可以立即删除和返回所有这些行为(但是这种态度阻止动态动画中的所有移动,所以您也应该考虑其他不那么有害的方式)。
此解决方案是一种折衷方案,因为它会停止项目的移动,因此如果您发现更好的解决方案,请添加您的答案…

谢谢您的回答。但是,我的最终目的是定期(相当快,可能使用UIDynamicBehavior的动作块)增加多个项目的旋转,每个项目上有5个行为,因为我希望它们在一段时间后不会停止移动。我认为一直重复所有的行为是不明智的。但我会试试,让你们知道它是否能流畅地工作。是的,这不起作用,因为它会阻止正方形的运动。顺便问一下,如果不建议显式设置项目的位置和旋转,为什么会存在updateTimeSingCurrentState:方法?谢谢您的回答。但是,我的最终目的是定期(相当快,可能使用UIDynamicBehavior的动作块)增加多个项目的旋转,每个项目上有5个行为,因为我希望它们在一段时间后不会停止移动。我认为一直重复所有的行为是不明智的。但我会试试,让你们知道它是否能流畅地工作。是的,这不起作用,因为它会阻止正方形的运动。顺便问一下,如果不建议显式设置项目的位置和旋转,为什么会存在UpdateTimeSingCurrentState:方法?真是太好了!!!UpdateTimeSingCurrentState对这件事不起作用真是太差劲了,它起作用了!!!UpdateTimeSingCurrentState对此不起作用,这太差劲了
- (void)rotateItem:(UICollectionViewLayoutAttributes *)item toAngle:(CGFloat)angle
{
    CGPoint center = item.center;
    [self.dynamicAnimator removeBehavior:self.parentBehavior];
    item.transform = CGAffineTransformMakeRotation(angle);
    [self.dynamicAnimator addBehavior:self.parentBehavior];
}