iOS 화면 회전 및 잠 금 화면 예제 코드

영상 개발 을 할 때 스크린 회전 문제 가 발생 했 는데 그 중에서StatusBar、 UINavigationController、UITabBarController 、UIViewcontroller와 관련된다.
장치 잠 금 화면 에서 의 전체 효과 도

iOS-회전.gif
주로 다음 과 같은 4 가지 와 관련된다.
  • 가로 세로 화면의 회전
  • 화면 회전 에 따라 보기 위치 변경
  • 회전 시 상태 표시 줄 의 숨 김 및 표시
  • 잠 금 화면
  • 1.가로 세로 회전
    1 단계:
    
    -(UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    
    //  NSLog(@"0000000---------%@",NSStringFromClass([[self topViewController] class]));
    //  if ([NSStringFromClass([[self topViewController] class]) isEqualToString:@"FirstViewController"]) {
    //    //  
    //    return UIInterfaceOrientationMaskLandscapeRight;
    //  }
    //  //  
    //  return UIInterfaceOrientationMaskPortrait;
      
      NSUInteger orientations = UIInterfaceOrientationMaskAllButUpsideDown;
    
      if(self.window.rootViewController){
        //          
        UIViewController *presentedViewController = [self topViewControllerWithRootViewController:self.window.rootViewController];
        //                 (                  )
        NSLog(@"%s, line = %d",__FUNCTION__,__LINE__);
        orientations = [presentedViewController supportedInterfaceOrientations];
      }
    
      return orientations;
    }
    //           
    //- (UIViewController*)topViewController {
    //  NSLog(@"%s, line = %d",__FUNCTION__,__LINE__);
    //  return [self topViewControllerWithRootViewController:[UIApplication sharedApplication].keyWindow.rootViewController];
    //}
    //           
    - (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController {
      NSLog(@"%s, line = %d",__FUNCTION__,__LINE__);
      if ([rootViewController isKindOfClass:[UITabBarController class]]) {
        
        UITabBarController* tabBarController = (UITabBarController*)rootViewController;
        NSLog(@"Tabbar:%@",NSStringFromClass([tabBarController.selectedViewController class]));
    
        return [self topViewControllerWithRootViewController:tabBarController.selectedViewController];
      } else if ([rootViewController isKindOfClass:[UINavigationController class]]) {
        
        UINavigationController* nav = (UINavigationController*)rootViewController;
        NSLog(@"nav:%@",NSStringFromClass([nav.visibleViewController class]));
        return [self topViewControllerWithRootViewController:nav.visibleViewController];
      } else if (rootViewController.presentedViewController) {
        NSLog(@"present:%@",NSStringFromClass([rootViewController.presentationController class]));
        UIViewController* presentedViewController = rootViewController.presentedViewController;
        return [self topViewControllerWithRootViewController:presentedViewController];
      } else {
        NSLog(@"root:%@",rootViewController);
        return rootViewController;
      }
    }
    코드 에서-(UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window방법 으로 컨트롤 러 를 자신의 제어 에 맡 깁 니 다.이 방법 은 기본 값Info.plist에서 설정 한Supported interface orientations항목 의 값 입 니 다.
    STEP 2:컨트롤 러 별로 지원 하 는 방향 설정
    
    //      (    )
    - (BOOL)shouldAutorotate {
      return YES;
    }
    
    - (UIInterfaceOrientationMask)supportedInterfaceOrientations{
      //       
      return UIInterfaceOrientationMaskAll;
    }
    그 중에서- supportedInterfaceOrientations방법 은 아이 패드 에서 기본 값UIInterfaceOrientationMaskAll,즉 모든 화면 방향 을 기본 으로 지원 합 니 다.반면 아이 폰 과 아 이 팟 터치 의 기본 값 은UIInterfaceOrientationMaskAllButUpsideDown으로 세로 화면 을 제외 한 세 방향 을 지원 한다.
    장치 화면 이 회전 할 때 시스템 호출- shouldAutorotate방법 으로 현재 인터페이스 가 회전 을 지원 하 는 지 확인 합 니 다.- shouldAutorotate이 돌아 올 때YES방법 만 호출 되 어 회전 인터페이스 가 필요 한 지 확인 합 니 다.
    이것 은- supportedInterfaceOrientations에 설 치 된 것 으로 관련TabbarController의 지원 방향 에 영향 을 줄 수 있 으 므 로UIViewController에 더 설치 해 야 합 니 다.
    
    //                
     - (UIInterfaceOrientationMask)supportedInterfaceOrientations {
       NSLog(@"%s, line = %d",__FUNCTION__,__LINE__);
       UIInterfaceOrientationMask inter;
       if (_lockScreen) {
         switch (_lockOrientation) {
           case 1:
             inter = UIInterfaceOrientationMaskPortrait;
             break;
           case 2:
             inter = UIInterfaceOrientationMaskPortraitUpsideDown;
             break;
           case 3:
             inter = UIInterfaceOrientationMaskLandscapeRight;
             break;
           case 4:
             inter = UIInterfaceOrientationMaskLandscapeLeft;
             break;
           default:inter = UIInterfaceOrientationMaskAll;
             break;
         }
       } else {
         inter = UIInterfaceOrientationMaskAll;
       }
       //      
       return inter;
     }
    STEP 3:컨트롤 러 방향 강제 전환
    
    - (void)setInterOrientation:(UIInterfaceOrientation)orientation {
       
       if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
         SEL selector       = NSSelectorFromString(@"setOrientation:");
         NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
         [invocation setSelector:selector];
         [invocation setTarget:[UIDevice currentDevice]];
         int val         = orientation;
         //  2     0 1        selector target  
         [invocation setArgument:&val atIndex:2];
         [invocation invoke];
       }
     }
    이렇게 하면 가로 세로 화면의 전환 을 완성 할 수 있다.
    2.화면 회전 시 보기 위치 변경
    여기 서 먼저 확장UIViewController지식UIDeviceOrientation & UIInterfaceOrientation설비 의 물리 적 방향UIDeviceOrientation즉,우리 가 손 에 들 고 있 는 모 바 일 장치UIDeviceOrientation는 세 개의 공간 으로 여섯 개의 방향 이 있 고Orientation을 통 해 현재 장치 의 방향 을 얻 을 수 있다.
    
    typedef NS_ENUM(NSInteger, UIDeviceOrientation) {
      UIDeviceOrientationUnknown,
      UIDeviceOrientationPortrait,      
      UIDeviceOrientationPortraitUpsideDown, // Device oriented vertically, home button on the top     ,    ,Home    
      UIDeviceOrientationLandscapeLeft,    // Device oriented horizontally, home button on the right      ,Home   
      UIDeviceOrientationLandscapeRight,   // Device oriented horizontally, home button on the left      ,Home   
      UIDeviceOrientationFaceUp,       // Device oriented flat, face up
      UIDeviceOrientationFaceDown       // Device oriented flat, face down
    } ;
    [UIDevice currentDevice].orientation인터페이스의 표시 방향UIInterfaceOrientation즉,우리 가 본 보기UIInterfaceOrientationOrientation가 있 는 방향 으로 이해 할 수 있 고 2 차원 공간 으로 네 가지 방향 이 있 으 며statusBar즉 상태 표시 줄 의 방향 을 통 해 현재 인터페이스 방향 을 얻 을 수 있다.
    
    // Note that UIInterfaceOrientationLandscapeLeft is equal to  UIDeviceOrientationLandscapeRight (and vice versa).
    // This is because rotating the device to the left requires rotating the content to the right.
    typedef NS_ENUM(NSInteger, UIInterfaceOrientation) {
      UIInterfaceOrientationUnknown      = UIDeviceOrientationUnknown,
      UIInterfaceOrientationPortrait      = UIDeviceOrientationPortrait,
      UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,
      UIInterfaceOrientationLandscapeLeft   = UIDeviceOrientationLandscapeRight,
      UIInterfaceOrientationLandscapeRight   = UIDeviceOrientationLandscapeLeft
    }
    [UIApplication sharedApplication].statusBarOrientation지원 하 는 방향
    
    // iOS 6             
    typedef NS_OPTIONS(NSUInteger, UIInterfaceOrientationMask) {
     UIInterfaceOrientationMaskPortrait = (1 << UIInterfaceOrientationPortrait),
     UIInterfaceOrientationMaskLandscapeLeft = (1 << UIInterfaceOrientationLandscapeLeft),
     UIInterfaceOrientationMaskLandscapeRight = (1 << UIInterfaceOrientationLandscapeRight),
     UIInterfaceOrientationMaskPortraitUpsideDown = (1 << UIInterfaceOrientationPortraitUpsideDown),
     UIInterfaceOrientationMaskLandscape = (UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),
     UIInterfaceOrientationMaskAll = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown),
     UIInterfaceOrientationMaskAllButUpsideDown = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),
    }
    위 에서 발견 할 수 있 습 니 다:
    iOS 6 및 그 후 버 전에 서 사용 하 는UIInterfaceOrientationMask형식 으로 화면 방향 을 제어 합 니 다.이 유형 도 몇 개의 매 거 진 값 을 추가 하여 하나의 매 거 진 값 으로 여러 화면 방향 을 대표 하여 사용 하기에 더욱 편리 합 니 다.
    주의UIInterfaceOrientationMask에 주석 이 있 습 니 다.
    Note that UIInterfaceOrientationLandscapeLeft is equal to UIDeviceOrientationLandscapeRight (and vice versa).
    This is because rotating the device to the left requires rotating the content to the right,대 의 는 인터페이스의 좌회전 은 장치 의 우회전 에 해당 하 며 장치 가 좌회전 할 때 내용(즉 인터페이스)이 오른쪽으로 돌아 야 한 다 는 것 입 니 다.즉:UIInterfaceOrientation UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight
    다음은 예 를 들 어 설명 하 겠 습 니 다.
    사실UIInterfaceOrientationLandscapeRight = UIDeviceOrientationLandscapeLeftUIDeviceOrientation은 서로 상 관 없 는 두 개의 속성 으로 통상 적 인 상황 에서 함께 나타 나 는데 여기 서 이 특성 을 이용 하여 화면 이 회전 한 후에 다시 배치 할 수 있다.
    STEP 1:감청UIInterfaceOrientation상태
    
    //                 
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationDidChange) name:UIDeviceOrientationDidChangeNotification object:nil];
    
    //              
    - (void)deviceOrientationDidChange
    {
      [self isPortrait]; 
    }
    STEP 2:재배 치
    
    if (_interOrientation == UIInterfaceOrientationPortrait || _interOrientation == UIInterfaceOrientationPortraitUpsideDown) {
         self.top.constant = 145;
         self.bottom.constant = 210;
         
       } else if (_interOrientation == UIInterfaceOrientationLandscapeRight || _interOrientation == UIInterfaceOrientationLandscapeLeft) {
         self.top.constant = 40;
         self.bottom.constant = 50;
       }
    세로
    인터페이스 세로 화면UIDeviceOrientationDidChangeNotification->가로 화면UIInterfaceOrientationPortrait,장치 방향UIInterfaceOrientationLandscapeRight->UIDeviceOrientationPortrait,장치 가 변화 하 는 과정 에서 감청UIDeviceOrientationLandscapeLeft을 촉발 한 다음 에 재 구성 합 니 다.
    3.회전 시 상태 표시 줄 숨 기기 및 표시
    회전 할 때 상태 표시 줄 의 변화 만 기술 하고 세로 화면 에서 가로 화면 이 변 하려 고 할 때 상태 표시 줄 이 사라 집 니 다.
    
    //    `UIViewController`      
    - (BOOL)prefersStatusBarHidden {
     NSLog(@"%s, line = %d",__FUNCTION__,__LINE__);
     return NO;
    }
    4.잠 금 화면
    잠 금 화면 을 잠 글 때 시스템 잠 금 화면 이 닫 히 든 Push 또는 Present 가 돌아 오 든 화면 은 변 하지 않 습 니 다.
    STEP 1:잠 금 화면 설정
    
    - (IBAction)lockAction:(UIButton *)sender {
       if (_lockScreen) {
         
         _lockScreen = NO;
         [sender setTitle:@"    " forState:UIControlStateNormal];
       } else {
         _lockScreen = YES;
         
         [sender setTitle:@"    " forState:UIControlStateNormal];
       }
       _lockOrientation = _interOrientation;
     }
    STEP 2:강 회전
    
    - (void)interfaceOrientation:(UIInterfaceOrientation)orientation
     {
       
       [self isPortrait];
       //         
       if (!_lockScreen) {
         [self setInterOrientation:orientation];
       }
    STEP 3:Push 또는 Present 에 대한 반환 후
    
    - (void)viewWillAppear:(BOOL)animated {
       
       if (_lockScreen) {
         //          
         [self setInterOrientation:_lockOrientation];
       } else {
        [self isPortrait];
       }
     }
    5.특정UIDeviceOrientationDidChangeNotification방향 에 대한 지원
    
    -(UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
     
       if ([NSStringFromClass([[self topViewController] class]) isEqualToString:@"FirstViewController"]) {
         //  
         return UIInterfaceOrientationMaskLandscapeRight;
       }
       //  
       return UIInterfaceOrientationMaskPortrait;
     }
    마지막 으로GitHub코드 를 드 리 고 작은 bug 도 2 개 있 습 니 다.관심 있 는 분 들 은 어서 오 세 요.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기