這是一個有趣的想法,通過UIInterpolatingMotionEffect
來更新某些行爲,但我並不認爲它是爲此設計的。如果你想根據加速度計信息更新行爲,我個人會認爲CMMotionManager
是理想的。
所需的用戶體驗在視頻剪輯中並不完全清晰,但看起來像視頻讓手機沿傾斜方向繼續滑動,直到您停止傾斜手機。如果這是你想要什麼,我傾向於用UIKit的動態UIGravityBehavior
結婚CMMotionManager
:
self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:container];
UICollisionBehavior *collision = [[UICollisionBehavior alloc] initWithItems:container.subviews];
collision.translatesReferenceBoundsIntoBoundary = YES;
[self.animator addBehavior:collision];
UIGravityBehavior *gravity = [[UIGravityBehavior alloc] initWithItems:container.subviews];
gravity.gravityDirection = CGVectorMake(0, 0);
[self.animator addBehavior:gravity];
self.motionManager = [[CMMotionManager alloc] init];
typeof(self) __weak weakSelf = self;
[self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMDeviceMotion *motion, NSError *error) {
if (weakSelf.referenceAttitude == nil) {
weakSelf.referenceAttitude = motion.attitude;
} else {
CMAttitude *attitude = motion.attitude;
[attitude multiplyByInverseOfAttitude:weakSelf.referenceAttitude];
gravity.gravityDirection = CGVectorMake(attitude.roll * 5.0, attitude.pitch * 5.0);
}
}];
如果你希望他們根據的態度精確地移動,停止運動,當你停止移動設備(像UIInterpolatingMotionEffect
一樣),你可以使用一個UIAttachmentBehavior
,是這樣的:
UIAttachmentBehavior *attachment = [[UIAttachmentBehavior alloc] initWithItem:viewToAttachTo attachedToAnchor:viewToAttachTo.center];
[self.animator addBehavior:attachment];
self.motionManager = [[CMMotionManager alloc] init];
self.motionManager.deviceMotionUpdateInterval = 1.0/20.0;
typeof(self) __weak weakSelf = self;
CGPoint originalAnchorPoint = viewToAttachTo.center;
[self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMDeviceMotion *motion, NSError *error) {
if (weakSelf.referenceAttitude == nil) {
weakSelf.referenceAttitude = motion.attitude;
} else {
CMAttitude *attitude = motion.attitude;
[attitude multiplyByInverseOfAttitude:weakSelf.referenceAttitude];
attachment.anchorPoint = CGPointMake(originalAnchorPoint.x + attitude.roll * 10.0, originalAnchorPoint.y + attitude.pitch * 10.0);
}
}];
注意,在這兩個的這些例子,我從當設備的方向施加調整行爲作爲設備轉移用戶啓動了應用程序。因此,我捕獲了CMAttitude
屬性,referenceAttitude
是用戶啓動應用程序時設備的態度,然後在後續更新中使用multiplyByInverseOfAttitude
以應用與原始方向有關的重力。顯然,如果你想要的話,你也可以採用預定的態度。
但希望上面說明了解決這種UX的一種方法。
來源
2014-09-17 13:00:08
Rob
是的,我不知道鏈接到加速度計的任何UIKit動態行爲,所以您可能仍然需要通過'CMMotionManager'過程。順便說一下,我不確定我會採用與加速度計信息相關的推送,而是根據「CMMotionManager」信息調整「UIGravityBehavior」或「UIAttachmentBehavior」。這取決於所需的UX。我猜你也可以在設備傾斜度達到某個閾值時進行推動,但這不是我想要吸引的用戶體驗(沒有雙關語意圖)。 – Rob 2014-09-13 17:12:29
您可能會建議如何簡化代碼,您可能希望將代碼的重要部分添加到您的問題中。這也可能使所需的用戶體驗更清晰一些,因爲我很難與UIPushBehavior協調「類似於UIInterpolatingMotionEffect」(就像我說的,它感覺更像是一個「改變的附件」而不是「推送」 )。 – Rob 2014-09-13 17:16:52
R ...(1)非常感謝百萬對重力/附件的建議,我會徹底嘗試這種方法。 (2)注意,確實,相關問題可能是對問題的更好表達。 (一旦我獲得這些價值,我很容易「知道該做什麼」;看起來不可思議,但很難獲得這些價值!)(3)重新體現「UX價值」 - 我在問題中添加了幾個詞語和視頻。當然,人們可以看到iOS中的短信推送效應和iOS中的視差bg效應,因爲完全無用而愚蠢(許多消費者確實感覺到這一點)。當然「這只是一種效果」) – Fattie 2014-09-14 07:40:27