programing

iOS 방향 변경 즉시 감지

procenter 2021. 1. 16. 10:41
반응형

iOS 방향 변경 즉시 감지


장치 방향이 게임 상태에 영향을 미치는 게임이 있습니다. 사용자는 가로, 세로 및 가로 반전 방향을 빠르게 전환해야합니다. 지금까지 다음을 통해 오리엔테이션 알림을 위해 게임을 등록했습니다.

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

그러나 너무 느립니다. 전화를 회전하고 알림이 실제로 실행되는 사이에 약 1 초의 지연이있는 것 같습니다. 장치 방향의 변화를 즉시 감지하는 방법이 필요합니다. 자이로 스코프를 실험 해 보았지만 아직 제가 찾고있는 솔루션인지 아닌지 알 수있을만큼 충분히 익숙하지 않습니다.


지연 이에 대한 얘기는 사실은 거짓 (원치 않는) 방향 변경 알림을 방지하는 필터입니다.

들어 인스턴트 장치 방향 변화의 인식 당신은 가속도계를 직접 모니터링 할거야 단지입니다.

가속도계는 세 축 모두에서 가속도 (중력 포함)를 측정하므로 실제 방향을 파악하는 데 문제가 없어야합니다.

가속도계 작업을 시작하는 일부 코드는 여기에서 찾을 수 있습니다.

iPhone 앱을 만드는 방법 – 5 부 : 가속도계

이 멋진 블로그는 수학 부분을 다룹니다.

가속도계 사용


viewWillAppear함수에 알리미 추가

-(void)viewWillAppear:(BOOL)animated{
  [super viewWillAppear:animated];
  [[NSNotificationCenter defaultCenter] addObserver:self  selector:@selector(orientationChanged:)    name:UIDeviceOrientationDidChangeNotification  object:nil];
}

방향 변경은이 기능을 알립니다.

- (void)orientationChanged:(NSNotification *)notification{
   [self adjustViewsForOrientation:[[UIApplication sharedApplication] statusBarOrientation]];
}

차례로 moviePlayerController 프레임이 방향이 처리되는이 함수를 호출합니다.

- (void) adjustViewsForOrientation:(UIInterfaceOrientation) orientation {

    switch (orientation)
    {
        case UIInterfaceOrientationPortrait:
        case UIInterfaceOrientationPortraitUpsideDown:
        { 
        //load the portrait view    
        }

            break;
        case UIInterfaceOrientationLandscapeLeft:
        case UIInterfaceOrientationLandscapeRight:
        {
        //load the landscape view 
        }
            break;
        case UIInterfaceOrientationUnknown:break;
    }
}

viewDidDisappear알림 제거

-(void)viewDidDisappear:(BOOL)animated{
   [super viewDidDisappear:animated];
   [[NSNotificationCenter defaultCenter]removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];
}

방향에 따라 뷰를 변경할 수 있는 가장 빠른 것 같아요


사용하지 않은 이유

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

?

또는 이것을 사용할 수 있습니다

-(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

Or this

-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation

Hope it owl be useful )


For my case handling UIDeviceOrientationDidChangeNotification was not good solution as it is called more frequent and UIDeviceOrientation is not always equal to UIInterfaceOrientation because of (FaceDown, FaceUp).

I handle it using UIApplicationDidChangeStatusBarOrientationNotification:

//To add the notification
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didChangeOrientation:)

//to remove the
[[NSNotificationCenter defaultCenter]removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];

 ...

- (void)didChangeOrientation:(NSNotification *)notification
{
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;

    if (UIInterfaceOrientationIsLandscape(orientation)) {
        NSLog(@"Landscape");
    }
    else {
        NSLog(@"Portrait");
    }
}

Try making your changes in:

- (void) viewWillLayoutSubviews {}

The code will run at every orientation change as the subviews get laid out again.


@vimal answer did not provide solution for me. It seems the orientation is not the current orientation, but from previous orientation. To fix it, I use [[UIDevice currentDevice] orientation]

- (void)orientationChanged:(NSNotification *)notification{
    [self adjustViewsForOrientation:[[UIDevice currentDevice] orientation]];
}

Then

- (void) adjustViewsForOrientation:(UIDeviceOrientation) orientation { ... }

With this code I get the current orientation position.

ReferenceURL : https://stackoverflow.com/questions/12085990/detecting-ios-orientation-change-instantly

반응형