iOS:UIDynamicAnimator updateItemUsingCurrentState不适用于旋转

我试图在UIDynamics中手动更改视图的旋转,但视图的旋转始终在更新后重置。 该文档说,UIDynamicAnimator的updateItemUsingCurrentState:方法应该更新一个项目的位置和旋转,但只有位置被更新。
我创build了一个简短的例子,一个方形的视图从屏幕上掉下来,触摸后它应该被放置在触摸的位置并旋转到45度。 然而,没有旋转发生(有时旋转可以看到几分之一秒,但之后,它又被重置):

#import "ViewController.h" @interface ViewController () { UIDynamicAnimator* _animator; UIView* _square; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; _square = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)]; _square.backgroundColor = [UIColor grayColor]; [self.view addSubview:_square]; _animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; UIGravityBehavior *gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[_square]]; gravityBehavior.magnitude = 0.1; [_animator addBehavior:gravityBehavior]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [[event allTouches] anyObject]; _square.center = [touch locationInView:self.view]; NSLog(@"transform before rotation: %@", NSStringFromCGAffineTransform(_square.transform)); _square.transform = CGAffineTransformMakeRotation(M_PI/4); [_animator updateItemUsingCurrentState:_square]; NSLog(@"transform after rotation: %@", NSStringFromCGAffineTransform(_square.transform)); } @end 

(我在这里留下了所有的代码,这样你就可以将它复制粘贴到一个新创build的项目中,希望没有太多不相关的代码让它干扰)

那么我做错了什么? 或者是不是可以明确地改变视图的旋转?

基于Infinity James的回答,我发现了一个很好的解决scheme。 所以要更新一个项目的旋转,你需要
1.从animationanimation中删除所有影响项目的行为
2.更新项目的旋转
3.将移除的行为返回给animation师(不需要创build新的行为)

注意 :您可以将所有行为添加到一个父行为作为子行为,因此您可以一次删除并返回所有这些行为(但这种态度会阻止dynamicanimation制作者的所有动作,因此您应该考虑其他更less伤害的方法)。

 - (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]; } 

这个解决scheme是一种妥协,因为它会停止物品的移动,所以如果你find更好的东西,请添加你的答案。

我的解决scheme是从animation师中删除行为,然后重新创build项目的修改状态的行为。 明确地设置一个项目的位置(通过center )和旋转并不是真正应该在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]; }