UIInterpolatingMotionEffect

UIInterpolatingMotionEffect

使用UIInterpolatingMotionEffect扭曲iPhone,即可移动图像。
现在:假设您将使用UICollisionBehavior和UIDynamicItemBehavior在屏幕上“反弹”一个红色块。当用户扭曲iPhone时:我希望这些框以类似的物理感觉“开始移动”,以使用UIInterpolatingMotionEffect。
http://tinypic.com/player.php?v=b67mlc%3E&s=8#.VBVEq0uZNFx
Aside:UX解释:弹性效果(例如:iPhone上的SMS)具有与iOS中的视差图像效果相同的“感觉”。 (通过“感觉”,我实际上是指相同的速度,加速度。)这将是第三个效果:像视差一样,它可以“稍微移动物体”,但是它们会“保持移动”,并弹起一点。 (您可以说,在某种程度上结合了“弹力列表效果”和“视差图像效果”。)
现在:使用CMAccelerometerData进行我描述的操作相对容易,并使用UIPushBehaviorModeInstantaneous进行推送。但这是很多混乱的代码。
相反,UIInterpolatingMotionEffect易于使用,很容易使用
本质上,如何从UIInterpolatingMotionEffect中获取值(然后将其用作推送)。干杯!

类似的想法...
Simply display the values of UIInterpolatingMotionEffect?
它简单地问:如何轻易地从UIInterpolatingMotionEffect中“获取”值?即,似乎难以置信的是必须认真地对CALayer进行子类化,等等。

最佳答案

通过UIInterpolatingMotionEffect更新某些行为是一个有趣的想法,尽管我不怀疑它是为此目的而设计的。如果要基于加速度计信息更新行为,我个人认为CMMotionManager是实现此目的的理想选择。

从视频剪辑中并不能完全清楚所需的UX,但是看起来视频在使事情继续沿手机倾斜的方向滑动,直到您停止倾斜手机为止。如果那是您想要的,我倾向于将CMMotionManager与UIKit Dynamics UIGravityBehavior结合起来:

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来施加与该原始方向有关的重力。显然,如果您愿意,也可以使用预定的态度。

但希望以上说明了解决此类用户体验的一种方法。

关于ios - 匹配UIInterpolatingMotionEffect的“插入”? (即,在UIInterpolatingMotionEffect上访问“物理”),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25809318/

10-12 00:39