亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS屏幕旋轉與鎖屏的示例代碼

2019-10-21 18:40:23
字體:
來源:轉載
供稿:網友

在做視頻開發時遇到屏幕旋轉問題,其中涉及到 StatusBar、 UINavigationController、UITabBarController 、UIViewcontroller 。

在設備鎖屏下的整體效果圖

iOS,屏幕旋轉,鎖屏,代碼

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 項的值。

第2步:在各控制器設置支持的方向

//是否允許旋轉(默認允許)- (BOOL)shouldAutorotate {  return YES;}- (UIInterfaceOrientationMask)supportedInterfaceOrientations{  //允許旋轉的方向  return UIInterfaceOrientationMaskAll;}

其中 - supportedInterfaceOrientations 方法在 iPad 中默認取值為 UIInterfaceOrientationMaskAll ,即默認支持所有屏幕方向;而 iPhone 跟 iPod Touch 的默認取值為 UIInterfaceOrientationMaskAllButUpsideDown ,即支持除豎屏向下以外的三個方向。

在設備屏幕旋轉時,系統會調用 - shouldAutorotate 方法檢查當前界面是否支持旋轉,只有 - shouldAutorotate 返回 YES 的時候, - supportedInterfaceOrientations 方法才會被調用,以確定是否需要旋轉界面。

這個是 TabbarController 中設置的,它會影響關聯的 UIViewController 的支持方向,需要在 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; }

第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、屏幕旋轉相應改變視圖位置

這里先擴展 UIDeviceOrientation & UIInterfaceOrientation 的知識

UIDeviceOrientation 設備的物理方向

UIDeviceOrientation 即我們手持的移動設備的 Orientation ,是一個三圍空間,有六個方向,通過 [UIDevice currentDevice].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} ;

UIInterfaceOrientation 界面的顯示方向

UIInterfaceOrientation 即我們看到的視圖的 Orientation ,可以理解為 statusBar 所在的方向,是一個二維空間,有四個方向, 通過 [UIApplication sharedApplication].statusBarOrientation 即狀態欄的方向獲取當前界面方向。

// 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}

UIInterfaceOrientationMask 支持的方向

// 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 類型來控制屏幕屏幕方向,該類型也新增加了幾個枚舉取值,可用一個枚舉取值來代表多個屏幕方向,使用起來更方便。

注意在 UIInterfaceOrientation 中有注釋

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,大意是界面的左轉相當于設備的右轉,如果設備向左轉時就需要內容(即界面)向右轉。即:

UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight 
UIInterfaceOrientationLandscapeRight = UIDeviceOrientationLandscapeLeft

下面還會舉例說明。

其實 UIDeviceOrientation 與 UIInterfaceOrientation 是兩個互不相干的屬性,通常情況下會一起出現,在這里正好利用此特性在屏幕旋轉后進行重新布局。

第1步:監聽 UIDeviceOrientationDidChangeNotification 狀態

//監聽設備旋轉 改變 視圖 對應位置 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationDidChange) name:UIDeviceOrientationDidChangeNotification object:nil];//用來控制橫豎屏時調整視圖位置- (void)deviceOrientationDidChange{  [self isPortrait]; }

第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;   }

例如:豎屏轉橫屏

界面豎屏 UIInterfaceOrientationPortrait ->橫屏 UIInterfaceOrientationLandscapeRight ,設備方向 UIDeviceOrientationPortrait -> UIDeviceOrientationLandscapeLeft ,在設備發生變化這個過程觸發 UIDeviceOrientationDidChangeNotification 監聽,然后進行重新布局。

3、旋轉時狀態欄的隱藏與顯示

這里只記述旋轉時狀態欄的變化,由豎屏想橫屏變化時狀態欄會消失。

//在需要的`UIViewController`設置是否隱藏- (BOOL)prefersStatusBarHidden { NSLog(@"%s, line = %d",__FUNCTION__,__LINE__); return NO;}

4、鎖屏

鎖屏時,不管系統鎖屏是否關閉、Push 或 Present 返回后,界面依然保持不變。

第1步:設置鎖屏

- (IBAction)lockAction:(UIButton *)sender {   if (_lockScreen) {          _lockScreen = NO;     [sender setTitle:@"鎖定屏幕" forState:UIControlStateNormal];   } else {     _lockScreen = YES;          [sender setTitle:@"解開屏幕" forState:UIControlStateNormal];   }   _lockOrientation = _interOrientation; }

第2步:繞過強轉

- (void)interfaceOrientation:(UIInterfaceOrientation)orientation {      [self isPortrait];   //鎖屏情況下 不旋轉   if (!_lockScreen) {     [self setInterOrientation:orientation];   }

第3步:針對 Push 或 Present 返回后

- (void)viewWillAppear:(BOOL)animated {      if (_lockScreen) {     //記錄返回時的界面狀態     [self setInterOrientation:_lockOrientation];   } else {    [self isPortrait];   } }

5、 針對特定 UIViewController 方向的支持

-(UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {    if ([NSStringFromClass([[self topViewController] class]) isEqualToString:@"FirstViewController"]) {     //橫屏     return UIInterfaceOrientationMaskLandscapeRight;   }   //豎屏   return UIInterfaceOrientationMaskPortrait; }

最后的獻上 GitHub 代碼,還有2個小的 bug ,有興趣的朋友歡迎來探討。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产在线观看精品| 国产精品99免视看9| 日韩av影视综合网| 日韩女在线观看| 色综合伊人色综合网站| 26uuu亚洲伊人春色| 久久视频这里只有精品| 一区二区三区美女xx视频| 久久精品中文字幕| 亚洲伊人成综合成人网| 精品无码久久久久久国产| 国产深夜精品福利| 国产69精品99久久久久久宅男| 欧美伊久线香蕉线新在线| 欧美最顶级的aⅴ艳星| 国产成人在线播放| 国产成人亚洲综合| 日韩av综合中文字幕| 欧美性一区二区三区| 国产福利精品在线| 国产精品久久久久av| 亚洲国产精品人久久电影| 欧美孕妇毛茸茸xxxx| 欧美日韩成人黄色| 97av视频在线| 亚洲视频专区在线| 欧美激情a在线| 92国产精品视频| 亚洲国产精品va在线看黑人动漫| 欧美大胆在线视频| 成人午夜在线影院| 成人黄色大片在线免费观看| 国产一区二中文字幕在线看| 日韩中文字幕精品| 国产精品自在线| 26uuu亚洲伊人春色| 国产日韩欧美综合| 精品免费在线观看| 精品视频久久久久久| 国产成人高清激情视频在线观看| 日韩在线精品一区| 17婷婷久久www| 久久久国产一区二区| 亚洲夜晚福利在线观看| 91最新国产视频| 亚洲人成电影在线| 日韩成人在线电影网| 69av在线视频| 日韩av在线免费| 久久人91精品久久久久久不卡| 日本成人黄色片| 亚洲一区中文字幕在线观看| 91亚洲精品在线观看| 日韩激情av在线免费观看| 色樱桃影院亚洲精品影院| 亚洲国产精品va在线| 欧洲成人午夜免费大片| 亚洲黄色av网站| 激情久久av一区av二区av三区| 久久综合国产精品台湾中文娱乐网| 国产伦精品一区二区三区精品视频| 91丨九色丨国产在线| 国产视频在线观看一区二区| 亚洲韩国日本中文字幕| 欧美裸体视频网站| 一区二区三区视频免费在线观看| 亚洲一区二区三区在线免费观看| 中文字幕亚洲欧美在线| 高潮白浆女日韩av免费看| 亚洲免费中文字幕| 91免费视频网站| 国产精品中文在线| 亚洲乱亚洲乱妇无码| 亚洲美女在线看| 最近2019年手机中文字幕| 91精品国产自产在线观看永久| 国产精品∨欧美精品v日韩精品| 欧美有码在线视频| 日韩av在线不卡| 午夜精品久久久99热福利| 成人网中文字幕| 92版电视剧仙鹤神针在线观看| 中文字幕免费精品一区| 日韩风俗一区 二区| 亚洲大胆人体视频| 国产精品久久久久久中文字| 日韩精品在线免费播放| 欧美裸体男粗大视频在线观看| 亚洲国产成人爱av在线播放| 国产视频在线一区二区| 亚洲精品欧美一区二区三区| 国产亚洲视频在线| 精品国内亚洲在观看18黄| 国产亚洲美女精品久久久| 国产成人精彩在线视频九色| 国产亚洲精品久久| 奇米影视亚洲狠狠色| 国产精品偷伦视频免费观看国产| 成人免费网站在线看| 成人性生交大片免费看视频直播| 日本久久中文字幕| 综合136福利视频在线| 亚洲精品日韩av| 91亚洲精品在线观看| 91国内在线视频| 中文字幕亚洲欧美日韩2019| 国产香蕉精品视频一区二区三区| 日韩中文娱乐网| 国产一区二区三区欧美| 日韩一区二区三区在线播放| 精品久久久久久久大神国产| 久久久精品视频成人| 日韩小视频在线观看| 国产视频精品免费播放| 欧美电影在线观看高清| 欧洲日本亚洲国产区| 国产精品一区二区久久久久| 国内精品久久久久久中文字幕| 亚洲人免费视频| 成人免费黄色网| 色哟哟网站入口亚洲精品| 亚洲精品有码在线| 91日本视频在线| 日韩视频免费观看| www.亚洲免费视频| 国产欧美日韩丝袜精品一区| 欧美成人激情图片网| 中文字幕免费国产精品| 欧美大码xxxx| 国产剧情久久久久久| 国内久久久精品| 国产日本欧美视频| 亚洲qvod图片区电影| 美日韩丰满少妇在线观看| 国产成人久久久精品一区| 色偷偷噜噜噜亚洲男人的天堂| 日韩中文在线观看| 免费av一区二区| 成人欧美一区二区三区黑人| 欧美日韩亚洲国产一区| 国产精品久久久久久五月尺| 日韩精品中文字幕有码专区| 欧美性猛交xxxx富婆弯腰| 亚洲欧美精品一区| 丝袜亚洲另类欧美重口| 亚洲精品国产精品久久清纯直播| 在线视频精品一| 亚洲欧美中文日韩在线v日本| 91大神在线播放精品| 97久久精品在线| 在线精品91av| 久久久久久久久久久久久久久久久久av| 亚洲国产精品小视频| 欧美中文字幕在线观看| 亚洲免费小视频| 亚洲国产欧美日韩精品| 国产精品老牛影院在线观看| 亚洲无限乱码一二三四麻| 国产日韩在线视频| 精品香蕉在线观看视频一| 久久99久久亚洲国产| 亚洲第一av在线| 欧美精品免费播放| 亚洲成av人影院在线观看|