본문 바로가기

프로그래밍/iOS

[iOS] 가속도계 센서 사용하기

출처는 http://jenemia.tistory.com/114

가속도계만 사용하기 위해 그 부분 소스만 참고하였다.

 

맨처음으로는 프레임 워크를 추가해야한다.

UIAccelero시리즈가 deprecated 되었기 때문에 CoreMotionManager를 사용해야 한다.

아래는 추가하는 법

프로젝트 설정에 들어가 General탭에 Linked Framworks and Libraries의 +버튼을 누른다.

그 후 CoreMotion.framework를 찾아 추가(Add) 버튼을 누른다.

이러면 프레임 워크 추가를 할 수 있다.

 

 

 

CoreMotion.h를 import

스토리 보드 상에 UI라벨을 하나 연결한 후 ViewController.h와 연결

MotionManager를 사용하기 위해서

CMMotionManager *motionManager변수를 추가한다.

 

 

 

@synthesize accelerometerLabel;를 통해 라벨변수 연결

 

- (void)viewDidLoad 함수 안에 아래의 코드 삽입

//ui라벨 1 이상 가능

    accelerometerLabel.numberOfLines=0;

    accelerometerLabel.lineBreakMode=YES;

    

    motionmanager=[[CMMotionManager alloc]init];//모션 관리자

    NSOperationQueue* queue=[[NSOperationQueue alloc]init];//모션관리자가 작업을 쌓아둘 

    if(motionmanager.accelerometerAvailable)//가속도계 사용 가능할 경우

    {

        motionmanager.accelerometerUpdateInterval=1.0/10.0;//0.1 단위로 업데이트

        //가속도계 센서 시작

        [motionmanager startAccelerometerUpdatesToQueue:queue withHandler:^(CMAccelerometerData * accelerometer, NSError *error)

         {

             NSString *labelText;//가속도 정보 저장할 문자열

             if(error)//에러인 경우

                 [motionmanager stopAccelerometerUpdates];//가속도계 센서 정지

             else

             {

                 //x,y,z, 값을 문자열에 저장

                 labelText=[NSString stringWithFormat:@"Accelerometer \n x : %+.2f \n y : %+.2f \n z: %+.2f",accelerometer.acceleration.x,accelerometer.acceleration.y,accelerometer.acceleration.z];

             }

             //UI라벨을 갱신하기 위해 메인쓰레드가 처리하게 설정

             [accelerometerLabel performSelectorOnMainThread:@selector(setText:) withObject:labelText waitUntilDone:YES];

         }

         ];

    }

    else//사용불가일 경우

    {

        accelerometerLabel.text=@"가속도계 지원 안함";

 

    }

 

실기계에서 아이폰 혹은 패드를 기울여 보면

 

실시간으로 숫자가 바뀌는 것을 확인할 수있다.

 

 

위의 가속도계 센서에 아래 그림과 같이 항상 위를 가리키는 화살표를 추가해 보자.

스샷은 아이패드 미니에서 캡쳐

 

 

프로젝트에 첨부한 파일을 드래그 하여 넣는다.(첨부한 화살표 그림 파일을 ViewController.m 드래그해서 바로 밑에다가 넣는다)

 

ViewController.h파일에 화살표 이미지를 위한한 UIImageView *arrow; 변수와

화살표가 항상 위를 가리키게 할 각도 값을 위한    float angle; 변수를 추가한다.

 

화살표 이미지를 화면에 출력하기 위해

viewDidLoad 함수안에 다음 코드를 추가한다.(캡쳐화면상에 #define으로 선언한 부분 PREPCONSTRAINTS(arrow)는 그냥 풀어서 쓴다. 

아래 코드대로 쓰면 된다.

 

arrow = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"arrow.png"]];//화살표 이미지 수에 화살표 그림 넣음

    [self.view addSubview:arrow];//화면에 화살표 이미지 추가

    [arrow setTranslatesAutoresizingMaskIntoConstraints:NO];//오토리사이징 금지

    //가로 세로 constraint추가-> 화살표를 가운데 두기 위해

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:arrow attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.0f constant:0.0f]];

 

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:arrow attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1.0f constant:0.0f]];

 

이제 가속도계 출력을 했던 코드 밑에 아래 코드를 넣으면 끝

// 화살표의 회전 

                 float xx = -accelerometer.acceleration.x;

                 float yy = accelerometer.acceleration.y;

                 angle = atan2(yy, xx);

                 dispatch_async(dispatch_get_main_queue(),^ //변경결과를 바로 실행하기 위함

                                {

                                    [arrow setTransform:CGAffineTransformMakeRotation(angle)];

 

                                });

이렇게만 하면 화면이 회전되어 화살표가 위를 가리키는지 확실히 모른다 따라서

세로 고정하기 위해 아래 두 함수를 ViewController.m에 추가

-(BOOL)shouldAutorotate

{

    return YES;

}

-(NSUInteger)supportedInterfaceOrientations

{

    return UIInterfaceOrientationMaskPortrait;

 

}