"Pousse" correspondant à UIInterpolatingMotionEffect? (c'est à dire accéder à "physique" sur UIInterpolatingMotionEffect)

Avec UIInterpolatingMotionEffect, tordez l'iPhone et vous pouvez faire bouger une image.

Maintenant: imaginez un bloc rouge que vous "rebondirez" à l'écran, en utilisant UICollisionBehavior et UIDynamicItemBehavior. Lorsque l'user tord l'iPhone: Je veux que les boîtes "commencent à bouger" AVEC SIMILAR PHYSICS FEEL pour utiliser UIInterpolatingMotionEffect.

http://tinypic.com/player.php?v=b67mlc%3E&s=8#.VBVEq0uZNFx

A part: Explication UX: l'effet bouncy (exemple: SMS sur iPhone) a la même "sensation" que l'effet d'image de parallaxe dans iOS. (Par "sentir" je veux juste dire la même vitesse, l'accélération.) Ce serait un troisième effet: comme la parallaxe, il "bougerait légèrement les choses" mais il "continuerait à bouger", rebondissant un peu. (On pourrait dire, en combinant quelque peu la sensation de l'effet bouncy-lists et de l'effet parallaxe-images.)

Maintenant: il est relativement facile de faire ce que je décris, en utilisant CMAccelerometerData, et en appliquant des poussées en utilisant UIPushBehaviorModeInstantaneous. Mais c'est beaucoup de code désordonné.

En revanche, UIInterpolatingMotionEffect est ridiculement facile à utiliser.

Essentiellement, comment puis-je get les valeurs de UIInterpolatingMotionEffect (que je vais ensuite utiliser comme pushes). À votre santé!


Pensée similaire …

Afficher simplement les valeurs de UIInterpolatingMotionEffect?

Il request simplement: comment peut-on facilement "get" les valeurs de UIInterpolatingMotionEffect? c'est-à-dire, il semble incroyable que l'on doive faire l'effort de sous-classr soigneusement CALayer, etc.

C'est une notion intéressante de mettre à jour un comportement via l' UIInterpolatingMotionEffect , bien que je ne pense pas qu'il soit conçu pour ça. Si vous voulez mettre à jour des comportements basés sur des informations d'accéléromètre, j'aurais personnellement pensé que le CMMotionManager est idéal dans ce but.

L'image UX souhaitée n'est pas tout à fait claire à partir du clip video, mais il semble que les videos continuent de glisser dans la direction où le téléphone est incliné jusqu'à ce que vous arrêtiez d'incliner le téléphone. Si c'est ce que vous voulez, je serais enclin à épouser CMMotionManager avec un 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); } }]; 

Si vous voulez qu'ils se déplacent précisément en fonction de l'attitude, en arrêtant le mouvement lorsque vous arrêtez de déplacer le périphérique (comme UIInterpolatingMotionEffect ), vous pouvez utiliser un UIAttachmentBehavior , quelque chose comme:

 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); } }]; 

Notez, dans ces deux exemples, que j'applique les ajustements aux comportements lorsque le périphérique passe de l'orientation de l'appareil lorsque l'user a démarré l'application. Ainsi, je capture une propriété CMAttitude , referenceAttitude à être l'attitude de l'appareil lorsque l'user a déclenché l'application, puis utilise multiplyByInverseOfAttitude sur les mises à jour ultérieures pour appliquer la gravité par rapport à cette orientation originale. Vous pouvez, évidemment, utiliser une attitude prédéterminée si vous le souhaitez aussi.

Mais espérons que ce qui précède illustre une approche pour s'attaquer à ce genre d'UX.