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]; }
- 有可能使用UIPageControl来控制UITableView的移动吗?
- Google Analytics(分析)不适用于iOS
- TransitionFromView删除先前的视图
- pushViewController没有navigationcontroller
- 如何创build基于nib文件的UINavigationItem.TitleView?
- 创build一个segue并通过Swift把它连接到两个视图控制器之间?
- 在iOS上,你可以做一个同步networking请求(但不是在主线程),仍然进展callback(在一个单独的,非主线程)?
- UITableViewCell跳过响应者链
- 是否有可能使用iPhone的音量控制button用于其他目的?