Гироскоп, Как ограничить перекрытие зрения - PullRequest
0 голосов
/ 22 февраля 2019

Гироскоп, как ограничить перекрытие просмотров?У меня есть 4 вида, которые движутся в соответствии с датчиком гироскопа.Я хочу, чтобы они не перекрывали друг друга.Пожалуйста, обратитесь к видео .

#import "CMDeviceMotionDemo.h"
@import CoreMotion;

@interface CMDeviceMotionDemo ()

@property (nonatomic, strong) CMMotionManager * motionManager;
@property (weak, nonatomic) IBOutlet UIView *ball;
@property (weak, nonatomic) IBOutlet UIView *ball2;
@property (strong, nonatomic) IBOutletCollection(UIView) NSArray *allViewObject;


@end

@implementation CMDeviceMotionDemo

#pragma mark Nothing to change here

float X = 0;
float Y = 0;
float R = 120;

float X2 = 50;
float Y2 = 50;
float R2 = 120;


- (void)initBall
{
     self.ball.frame = CGRectMake(300, 300, 120,120);
     self.ball.layer.cornerRadius = self.ball.bounds.size.height / 2;

     self.ball2.frame = CGRectMake(300, 300, 120,120);
     self.ball2.layer.cornerRadius = self.ball2.bounds.size.height / 2;

}

- (void)updateBallWithRoll:(float)roll Pitch:(float)pitch Yaw:(float)yaw accX:(float)accX accY:(float)accY accZ:(float)accZ
{
    // Roll NO : - 1
    X += 2 * roll;
    Y += 2 * pitch;
    X *= 0.8;
    Y *= 0.8;
    CGFloat newX = self.ball.frame.origin.x + X;
    CGFloat newY = self.ball.frame.origin.y + Y;
    newX = fmin(280, fmax(0, newX));
    newY = fmin(527, fmax(64, newY));

    CGFloat newR = R + 10 * accZ;

    X2 += 3 * roll;
    Y2 += 3 * pitch;

    X2 *= 0.6;
    Y2 *= 0.6;

    CGFloat newX2 = self.ball2.frame.origin.x + X2;
    CGFloat newY2 = self.ball2.frame.origin.y + Y2;

    newX2 = fmin(280, fmax(0, newX2));
    newY2 = fmin(527, fmax(64, newY2));

    self.ball.frame = CGRectMake(newX, newY, newR, newR);
    self.ball2.frame = CGRectMake(newX2, newY2, newR, newR);


}

#pragma mark Assignments

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(updateDeviceMotion) userInfo:nil repeats:YES];
    // TODO: 2.1

    // 2.1 Create a CMMotionManager instance and store it in the property "motionManager"
    self.motionManager = [[CMMotionManager alloc] init];

    // 2.1 Set the motion update interval to 1/60
    self.motionManager.deviceMotionUpdateInterval = 1.0 / 60.0;

    // 2.1 Start updating the motion using the reference frame CMAttitudeReferenceFrameXArbitraryCorrectedZVertical
    [self.motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryCorrectedZVertical];

}


-(void) updateDeviceMotion
{
    // TODO: 2.2

    // 2.2 Get the deviceMotion from motionManager
    CMDeviceMotion *deviceMotion = self.motionManager.deviceMotion;

    // 2.2 Return if the returned CMDeviceMotion object is nil
    if(deviceMotion == nil)
    {
        return;
    }

    // 2.2 Get the attitude from CMDeviceMotion
    CMAttitude *attitude = deviceMotion.attitude;

    // 2.2 Get the userAcceleration from CMDeviceMotion
    CMAcceleration userAcceleration = deviceMotion.userAcceleration;

    // 2.2 Call "updateBallWithRoll:Pitch:Yaw:accX:accY:accZ:" on self with the appropriate arguments

    float roll = attitude.roll;
    float pitch = attitude.pitch;
    float yaw = attitude.yaw;

    float accX = userAcceleration.x;
    float accY = userAcceleration.y;
    float accZ = userAcceleration.z;

    [self updateBallWithRoll:roll Pitch:pitch Yaw:yaw accX:accX accY:accY accZ:accZ ];//accZ

}

-(void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];

    if(self.motionManager != nil){

        // TODO: 2.3

        // 2.3 Stop updating the motionManager
        [self.motionManager stopDeviceMotionUpdates];

        // 2.3 Set the ivar "motionManager" to nil
        self.motionManager = nil;

    }
}
@end
...