달력

9

« 2019/9 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  •  
  •  
  •  
  •  
  •  

시작은 iOS7까지는 잘 되던게 iOS8로 올라오면서 CameraW에 제대로 동작을 안하는게 발견이 되어서였다.. 정확하게 얘기를 하면 iOS8의 문제는 아니었고 아이폰 6+의 문제였다.. 스프링보드에서 가로모드를 지원하면서 생긴 버그(?)가 아닐까 생각된다.. (애플느님아.. 우리 잘 좀 하자구요.. 응?)


우선 CameraW는 상태바가 없고 UIDeviceOrientationLandscapeLeft로 고정이 되어있는 형태다.. 단말이 돌아갈때 프리뷰 화면까지 덩달아 돌아가게 되면 무척이나 보기가 싫기 때문에 요렇게 구현이 되어있다.. 뭐 대부분의 카메라 앱들도 다 비슷할 듯.. 그래도 단말이 돌아갔다는 사실은 알아야 하기 때문에..


        
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedRotate:) name:UIDeviceOrientationDidChangeNotification object:nil];


요걸 사용해서 디바이스가 돌아간걸 체크하고 버튼들도 돌려주고 이미지를 저장할 때 오리엔테이션 값을 알아낸다..


그런데 발견된 문제가 앱을 실행한 직후의 오리엔테이션 값.. 세로로 실행을 해도 UIDeviceOrientationLandscapeLeft, 가로로 실행을 해도 UIDeviceOrientationLandscapeLeft, 뒤집어서 실행을 해도 UIDeviceOrientationLandscapeLeft.. -_-;; 그래서 실행하자마자 사진을 찍으면 항상 일정한 방향으로 잘 못찍히는 문제가 발견이 된 것이다..

구글링을 해보니 디바이스 오리엔테이션 말고 스테이터스 바의 오리엔테이션으로 체크를 해보라는 말들이 많아서 그걸로 해봤지만 스테이터스바를 안써서 그런지 아님 역시 같은 이유인지 여전히 UIDeviceOrientationLandscapeLeft로만 시작했다..


그래서 구글링을 더 해봤는데 뾰족한 수가 발견이 되지는 않았다.. 아이폰 6+만 발생하는 문제고 뭐든 한번 방향을 바꾸고나면 그 다음부터는 잘 되니까 그냥 묻을까, 아니 어떻게든 해결을 해야지!! 이 두가지 선택의 길에서 잠시 고민을 하던 중에..

CameraW 처음부터 가지고 있던 문제 하나가 로테이션 락이 걸린걸 어떻게 알아내는지 방법을 몰라서 락이 걸린 상태에서 사진을 찍으면 항상 가로로만 사진이 찍히는 현상이 있었는데, 이왕 디바이스 오리엔테이션에 대한 문제를 해결해야지 마음을 먹은 김에 그것도 찾아보기로 했다.. 전에 한번 찾다가 못찾았었는데 이번에는 의외로 아주 쉽게 그 해답을 찾았다.. (전엔 뭐한거야 대체 -_-;;) 설정된 값을 직접 읽어오는 방법은 여전히 못찾았지만 core motion과 액셀러레이터를 사용해서 디바이스의 오리엔테이션을 찾는 방법을 발견했다.. 소스부터 보면..


        
- (void)initCoreMotion
{
    _motionManager2 = [[CMMotionManager alloc] init];
    _motionManager2.accelerometerUpdateInterval = .2;
    _motionManager2.gyroUpdateInterval = .2;
    
    [_motionManager2 startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue]
                                        withHandler:^(CMAccelerometerData  *accelerometerData, NSError *error) {
                                            if (!error) {
                                                [self outputAccelertionData:accelerometerData.acceleration];
                                            }
                                            else{
                                                NSLog(@"%@", error);
                                            }
                                        }];
}

- (void)outputAccelertionData:(CMAcceleration)acceleration
{
    UIInterfaceOrientation orientationNew;
    
    if (acceleration.x >= 0.75) {
        orientationNew = UIInterfaceOrientationLandscapeLeft;
    }
    else if (acceleration.x <= -0.75) {
        orientationNew = UIInterfaceOrientationLandscapeRight;
    }
    else if (acceleration.y <= -0.75) {
        orientationNew = UIInterfaceOrientationPortrait;
    }
    else if (acceleration.y >= 0.75) {
        orientationNew = UIInterfaceOrientationPortraitUpsideDown;
    }
    else {
        // Consider same as last time
        return;
    }
    
    if (orientationNew == _orientationLast)
        return;
    
    _orientationLast = orientationNew;
    [self rotateViewForOrientation:_orientationLast];
}


어떤 양덕 형님이 친절하게 코드 만들어 주신거 그대로 가져다 쓰니까 잘 된다.. 그리고 이걸 사용을 하니 처음 얘기했던 앱을 딱 실행했을 때 오리엔테이션 값을 잘못 가져오는 일도 덩달아 해결이 됐다.. 므하하하하..


한번에 두마리 토끼를 잡고나니 기분이 매우 좋아져서 이렇게 간만에 블로깅도 한번.. ㅎㅎ


참잘했어요


오늘까지 테스트 좀더 해보고 섭밋 해야쥐..

Posted by 도노보노