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

首頁 > 系統 > iOS > 正文

總結iOS App開發中控制屏幕旋轉的幾種方式

2020-07-26 03:27:00
字體:
來源:轉載
供稿:網友

在iOS6之前的版本中,通常使用 shouldAutorotateToInterfaceOrientation 來單獨控制某個UIViewController的方向,需要哪個viewController支持旋轉,只需要重寫shouldAutorotateToInterfaceOrientation方法。
但是iOS 6里屏幕旋轉改變了很多,之前的 shouldAutorotateToInterfaceOrientation 被列為 DEPRECATED 方法,查看UIViewController.h文件也可以看到:

復制代碼 代碼如下:

// Applications should use supportedInterfaceOrientations and/or shouldAutorotate.. 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation NS_DEPRECATED_IOS(2_0, 6_0); 

程序將使用如下2個方法來代替:
復制代碼 代碼如下:

- (BOOL)shouldAutorotate; 
- (NSUInteger)supportedInterfaceOrientations; 

除了重寫這個2個方法,IOS6之后要旋轉還有一些需要注意的地方,下面會細述。另外還有一個硬性條件,需要在Info.plist文件里面添加程序支持的所有方向,可以通過以下2種方式添加
1.

201622991714779.png (493×56)

2.

201622991742247.png (492×242)

另外要兼容IOS6之前的系統,要保留原來的 shouldAutorotateToInterfaceOrientation 方法,還有那些 willRotateToInterfaceOrientation 等方法。

自動旋轉設置:
控制某個viewController旋轉并不是像IOS5或者IOS4一樣在這個viewController里面重寫上面那2個方法,而是需要在這個viewController的rootViewController(根視圖控制器)里面重寫,怎么解釋呢?就是最前面的那個viewController,直接跟self.window接觸的那個controller,比如以下代碼:

復制代碼 代碼如下:

UIViewController *viewCtrl = [[UIViewController alloc] init]; 
UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:viewCtrl]; 
if ([window respondsToSelector:@selector(setRootViewController:)]) { 
    self.window.rootViewController = navCtrl; 
} else { 
    [self.window addSubview:navCtrl.view]; 


如果需要設置viewCtrl的旋轉,那么不能在UIViewController里面重寫shouldAutorotate和supportedInterfaceOrientations方法,而是需要在navCtrl里面設置,又因為UINavigationController是系統控件,所以這里需要新建一個UINavigationController的子navigationController的子類,然后在里面實現shouldAutorotate和supportedInterfaceOrientations方法,比如:
復制代碼 代碼如下:

-(NSUInteger)supportedInterfaceOrientations{ 
    return UIInterfaceOrientationMaskAllButUpsideDown; 

 
- (BOOL)shouldAutorotate{ 
    return YES; 
}

eg1:如果上面的例子是self.window.rootViewController = viewCtrl,而不是navCtrl,那么上面的那2個控制旋轉的方法就應該寫在UIViewController里面!

eg2:如果viewCtrl又pushViewController到viewCtrl2,需要設置viewCtrl2的旋轉,怎么辦呢? 還是在navCtrl里面控制,因為viewCtrl和viewCtrl2的rootViewController都是navCtrl,一般的寫法都是

復制代碼 代碼如下:

UIViewController *viewCtrl2 = [[UIVewController alloc] init]; 
[self.navigationController.navigationController pushViewController:viewCtrl2 animated:YES];

所以要控制一個UINavigationController push到的所有viewController的旋轉,那么就得在navCtrl里面區分是哪個viewController,以便對他們一一控制!同樣如果rootViewController是UITabbarController,那么需要在子類化的UITabbarController里面重寫那2個方法,然后分別控制!

但是有時候我初始化UINavigationController的時候,并不知道所有我所有需要push到的viewController,那么這里有一個通用的方法,就是讓viewController自己來控制自己,首先在navCtrl里面的實現方法改為以下方式:

復制代碼 代碼如下:

- (BOOL)shouldAutorotate   
{   
    return self.topViewController.shouldAutorotate;   
}   
   
- (NSUInteger)supportedInterfaceOrientations   
{   
    return self.topViewController.supportedInterfaceOrientations;   


全部調用self.topViewController,就是返回當前呈現出來的viewController里面的設置,然后在viewCtrl、viewCtrl2等等這些viewController里面重寫shouldAutorotate和supportedInterfaceOrientations,以方便設置每個viewController的旋轉

eg3:如果viewCtrl 是 presentModalViewController 到 viewCtrl3,那么viewCtrl3的旋轉設置就不在navCtrl里面了!如果presentModalViewController的viewController是navController、tabbarController包裝過的viewCtrl3,那么就應在新包裝的navController、tabbarController里面設置,如果是直接presentModalViewController到viewCtrl3,那么就在viewCtrl3里面設置


手動旋轉
手動旋轉也有2種方式,一種是直接設置 UIDevice 的 orientation,但是這種方式不推薦,上傳appStore有被拒的風險:

復制代碼 代碼如下:

if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) { 
    [[UIDevice currentDevice] performSelector:@selector(setOrientation:) withObject:(id)UIInterfaceOrientationPortrait]; 
}
 
第二種是假旋轉,并沒有改變 UIDevice 的 orientation,而是改變某個view的 transform,利用 CGAffineTransformMakeRotation 來達到目的,比如:
復制代碼 代碼如下:

self.view.transform = CGAffineTransformMakeRotation(M_PI/2) 

下面講解采用第二種方式的各版本手動旋轉:
思想是首先設置 statusBarOrientation,然后再改變某個view的方向跟 statusBarOrientation 一致!

那既然是旋轉,最少也得有2個方向,那么還是少不了上面說的那個硬性條件,先在plist里面設置好所有可能需要旋轉的方向。既然是手動旋轉,那么就要關閉自動旋轉:

復制代碼 代碼如下:

- (BOOL)shouldAutorotate{ 
        return NO; 
}
 
手動觸發某個按鈕,調用方法,這個方法的實現如下:
復制代碼 代碼如下:

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight]; 
self.view.transform = CGAffineTransformMakeRotation(M_PI/2); 
self.view.bounds = CGRectMake(0, 0, kScreenHeight, 320);
 

注意:
1. 只需要改變self.view.transform,那么self.view的所有subview都會跟著自動變;其次因為方向變了,所以self.view的大小需要重新設置,不要使用self.view.frame,而是用bounds。
2. 如果shouldAutorotate 返回YES的話,下面設置setStatusBarOrientation 是不管用的!setStatusBarOrientation只有在shouldAutorotate 返回NO的情況下才管用!

強制旋轉屏幕
最近接手了一個項目,正常情況下使用查看圖片是沒問題的。

用到了 MWPhotoBrowser 這個第三方圖片瀏覽庫。
不過發現了一個問題,就是設備橫屏modal這MWPhotoBrowser的時候,發生了圖片位置錯亂。

實在沒辦法,所以想到了一個餿主意。

就是modal的時候使用代碼把設備強制旋轉回去。

復制代碼 代碼如下:

//UIDevice+WJ.h
@interface UIDevice (WJ)
/**
 *  強制旋轉設備
 *  @param  旋轉方向
 */
+ (void)setOrientation:(UIInterfaceOrientation)orientation;
@end
//UIDevice+WJ.m
#import "UIDevice+WJ.h"
@implementation UIDevice (WJ)
//調用私有方法實現
+ (void)setOrientation:(UIInterfaceOrientation)orientation {
    SEL selector = NSSelectorFromString(@"setOrientation:");
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self instanceMethodSignatureForSelector:selector]];
    [invocation setSelector:selector];
    [invocation setTarget:[self currentDevice]];
    int val = orientation;
    [invocation setArgument:&val atIndex:2];
    [invocation invoke];
}
@end

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91免费人成网站在线观看18| 国产91在线播放九色快色| 亚洲黄色在线看| 欧美视频一二三| 91高潮精品免费porn| 欧美性xxxxhd| 91久久久久久久| 日韩亚洲精品电影| 国产97在线视频| 一道本无吗dⅴd在线播放一区| 色综合色综合久久综合频道88| 欧美成aaa人片在线观看蜜臀| 亚洲美女av黄| 91情侣偷在线精品国产| 亚洲国产精品悠悠久久琪琪| 日韩中文在线中文网在线观看| 日韩中文在线视频| 国产精品欧美激情在线播放| 国产伦精品一区二区三区精品视频| 欧美国产精品日韩| 成人夜晚看av| 国产在线观看一区二区三区| 国产精品日本精品| 91精品国产91久久久久福利| 岛国av一区二区在线在线观看| 91久久精品视频| 国产精品久久91| 成人免费看片视频| 91久久国产婷婷一区二区| 久久久精品视频在线观看| 欧美性视频在线| 国产精品丝袜久久久久久不卡| 久热精品视频在线免费观看| 欧美有码在线观看视频| 国产99久久精品一区二区永久免费| 国产精品视频地址| 久久国产一区二区三区| 国产成人精品最新| 亚洲乱码一区av黑人高潮| 精品国产精品三级精品av网址| 欧美人在线视频| 欧美电影免费播放| 欧美成人在线免费视频| 久久久精品免费| 欧美精品久久久久久久免费观看| 欧美日韩一区二区在线| 国产精品一区二区久久久久| 北条麻妃一区二区三区中文字幕| 精品亚洲男同gayvideo网站| 精品调教chinesegay| 日本精品在线视频| 亚洲精品中文字幕有码专区| 亚洲欧美日韩国产中文| 欧美性猛交xxxx久久久| 亚洲男人天堂九九视频| 亚洲福利小视频| 欧美中文在线字幕| 日韩欧美中文第一页| 亚洲片国产一区一级在线观看| 欧美精品18videos性欧美| 亚洲国产天堂久久综合网| 北条麻妃99精品青青久久| 69久久夜色精品国产7777| 欧美激情va永久在线播放| 91欧美精品午夜性色福利在线| 国产免费一区视频观看免费| 久久精品久久久久| 欧美激情视频在线免费观看 欧美视频免费一| 日韩成人在线视频| 欧美激情精品久久久久久大尺度| 日本一区二区不卡| 欧美精品videos另类日本| 国内精品久久久久久久久| 日韩精品免费一线在线观看| 久久久极品av| 亚洲情综合五月天| 国产精品三级美女白浆呻吟| 欧美性开放视频| 日韩欧美中文第一页| 色狠狠久久aa北条麻妃| 欧美精品xxx| 91国产精品电影| 538国产精品一区二区免费视频| 91爱爱小视频k| 成人日韩在线电影| 亚洲精品99久久久久| 中文字幕国产亚洲2019| 色yeye香蕉凹凸一区二区av| 91精品视频专区| 97av在线影院| 日韩一区二区在线视频| 久久久成人精品视频| 欧美一区二区三区艳史| 热久久免费视频精品| 精品中文视频在线| 九九综合九九综合| 欧美视频精品一区| 日韩欧美一区二区三区| 性欧美长视频免费观看不卡| 欧美在线一区二区三区四| 55夜色66夜色国产精品视频| 欧美亚洲视频在线观看| 日韩美女写真福利在线观看| 欧美视频免费在线| 国产一区二区三区四区福利| 亚洲在线观看视频网站| 国产精品对白刺激| 夜夜嗨av一区二区三区免费区| 亚洲成年人在线播放| 日韩中文字幕在线视频播放| 最近中文字幕日韩精品| 国产精品久久久久999| 欧美大片在线看免费观看| 欧美日韩在线视频一区二区| 亚洲性无码av在线| 国产精品美女久久久久久免费| 成人av色在线观看| 日韩av综合中文字幕| 91精品国产91久久久久久| 91网站免费看| 一区二区三区天堂av| 欧美黄色成人网| 97人人做人人爱| 亚洲精品视频在线观看视频| 91九色综合久久| 国产97在线亚洲| 日韩欧美国产中文字幕| 亚洲精品99999| 一本一本久久a久久精品牛牛影视| 亚洲精品乱码久久久久久按摩观| 日韩美女视频免费在线观看| 国产精品xxxxx| 精品国产成人av| 久久综合伊人77777尤物| 亚洲精品久久久久中文字幕二区| 91av国产在线| 国产欧美精品xxxx另类| 国产福利视频一区| 国产精品人成电影| 日韩中文字幕网址| 国产精品久久久久久久久久久久久| 亚洲乱码国产乱码精品精| 亚洲视频日韩精品| 欧美激情女人20p| 国产精品免费久久久久影院| 国产精品自产拍在线观| 欧美激情亚洲综合一区| 草民午夜欧美限制a级福利片| 日韩精品免费在线| 国产精品美女999| 国产精品96久久久久久又黄又硬| 1769国内精品视频在线播放| 久久天天躁狠狠躁夜夜爽蜜月| 国产小视频91| 色综合天天综合网国产成人网| 欧美激情精品久久久久久黑人| 国产精品成av人在线视午夜片| 国产成人亚洲综合| 亚洲高清福利视频| 韩国三级电影久久久久久| 国产精品亚洲欧美导航| 国产精品久久久久久久久久ktv| 久久99精品久久久久久琪琪| 亚洲一区二区三区四区在线播放|