使用UIDynamics和CMMotionManager的重力旋转UIView

时间:2014-12-22 20:35:29

标签: ios objective-c cmmotionmanager uikit-dynamics uiattachmentbehavior

我有一个UIView,它是一个挂在钉子上的相框。我试图围绕其anchorPoint旋转视图,以保持视图的底部平坦(与地面平行),无论设备旋转如何。我试图通过使用CMMotionManager和UIDynamics来实现这一点,并且今天似乎无法正常工作。 这是一些代码......

- (void)viewDidLoad
{
[super viewDidLoad];

self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];

CGRect pictureFrameBounds = CGRectMake(0.0f, 0.0f, CGRectGetWidth(self.view.bounds)/2.5f, CGRectGetHeight(self.view.bounds)/5);
UIView *pictureFrame = [[UIView alloc] initWithFrame:pictureFrameBounds];
[pictureFrame setBackgroundColor:[UIColor redColor]];
[self.view addSubview:pictureFrame];

self.gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[pictureFrame]];

self.collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[pictureFrame]];
[self.collisionBehavior setTranslatesReferenceBoundsIntoBoundary:YES];
[self.animator addBehavior:self.collisionBehavior];

CGPoint anchorPoint = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetHeight(self.view.bounds)/8);
self.attachmentBehavior = [[UIAttachmentBehavior alloc] initWithItem:pictureFrame
                                                    offsetFromCenter:UIOffsetMake(0.0f, -CGRectGetHeight(pictureFrame.bounds)/2.5f)
                                                    attachedToAnchor:anchorPoint];
[self.attachmentBehavior setDamping:0];
[self.attachmentBehavior setLength:0];
[self.attachmentBehavior setFrequency:0];
[self.animator addBehavior:self.attachmentBehavior];

UIDynamicItemBehavior *itemBehavior = [[UIDynamicItemBehavior alloc] initWithItems:@[pictureFrame]];
[itemBehavior setAllowsRotation:YES];
[self.animator addBehavior:itemBehavior];

NSOperationQueue* motionQueue = [NSOperationQueue new];

 self.motionManager = [[CMMotionManager alloc] init];
[self.motionManager startDeviceMotionUpdatesToQueue:motionQueue
                                        withHandler:^(CMDeviceMotion *motion, NSError *error) {
                                           [self.gravityBehavior setGravityDirection:CGVectorMake(motion.gravity.x, motion.gravity.y)];
                                        }];
}

我已经尝试使用motion.gravity.x作为itemBehavior上的angularForce来验证力是否正确返回,并且视图旋转正确的方向,一切似乎都很好。这种方法的问题在于,由于施加恒定的力,视图继续旋转。使用setGravityDirection:结果与视图锚定无旋转。一些帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:0)

尝试将NSOperationQueue更改为mainQueue。这帮助了我。

[self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMDeviceMotion *motion, NSError *error) {
[self.gravityBehavior setGravityDirection:CGVectorMake(motion.gravity.x, -(motion.gravity.y))];
}];

希望这也对你有帮助。