Mat*_*čík 1 objective-c ios ios7 uikit-dynamics
我正在尝试手动更改UIDynamics视图的旋转,但视图的旋转始终在更新后重置.该文件说,该UIDynamicAnimator的updateItemUsingCurrentState:方法应该更新项目的位置和旋转,而只是位置更新.
我创建了一个简短的示例,其中方形视图从屏幕上掉落,触摸后应将其定位到触摸位置并旋转到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
Run Code Online (Sandbox Code Playgroud)
(我在这里留下了所有代码,以便你可以将它复制粘贴到一个新创建的项目中.希望没有太多不相关的代码让它令人不安)
我做错了什么?或者是不是可以明确地改变视图的旋转?
基于Infinity James的回答,我找到了一个非常有效的解决方案.因此,要更新项目的旋转,您需要
1.从动态动画师中删除所有影响项目的行为
2.更新项目的旋转
3.将删除的行为返回给动画师(不需要创建新行为)
注意:你可以将所有行为添加到一个父行为作为子行为,因此您可以一次删除并返回所有行为(但这种态度会停止动态动画师的所有动作,因此您还应该考虑其他不那么伤害的方法).
- (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];
}
Run Code Online (Sandbox Code Playgroud)
这个解决方案是一种妥协,因为它会阻止物品的移动,所以如果你找到更好的东西,请添加你的答案......
| 归档时间: |
|
| 查看次数: |
1485 次 |
| 最近记录: |