iOS 화면 회전 및 잠 금 화면 예제 코드
StatusBar、 UINavigationController、UITabBarController 、UIViewcontroller
와 관련된다.장치 잠 금 화면 에서 의 전체 효과 도
iOS-회전.gif
주로 다음 과 같은 4 가지 와 관련된다.
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
즉,우리 가 본 보기UIInterfaceOrientation
는Orientation
가 있 는 방향 으로 이해 할 수 있 고 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 = UIDeviceOrientationLandscapeLeft
과UIDeviceOrientation
은 서로 상 관 없 는 두 개의 속성 으로 통상 적 인 상황 에서 함께 나타 나 는데 여기 서 이 특성 을 이용 하여 화면 이 회전 한 후에 다시 배치 할 수 있다.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 개 있 습 니 다.관심 있 는 분 들 은 어서 오 세 요.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.