近期公司項目需要部分頁面功能,找了找方法,也沒找到合適的,最后自己瞎研究出來。
6B801210-E4D2-47E6-88CF-7496DE64D4BD.jpg
說一下需要做法吧:我采用的是UINavigationController push方式
先了解下系統處理旋轉的流程:
首先讓我們來看看系統在程序的啟動過程UIKit處理屏幕旋轉的流程
當加速計檢測到方向變化的時候,會發出 UIDeviceOrientationDidChangeNotification 通知,這樣任何關心方向變化的view都可以通過注冊該通知,在設備方向變化的時候做出相應的響應。
UIKit幫助我們做了很多事情,方便我們完成屏幕旋轉。UIKit的相應屏幕旋轉的流程如下:
1、設備旋轉的時候,UIKit接收到旋轉事件。
2、UIKit通過AppDelegate通知當前程序的window。
3、Window會知會它的rootViewController,判斷該view controller所支持的旋轉方向,完成旋轉。
4、如果存在彈出的view controller的話,系統則會根據彈出的view controller,來判斷是否要進行旋轉。
最基本的是打開左右旋轉功能,即使你代碼添加旋轉,不打開會蹦的
image.png
在UINavigationController里修改(子類vc無效)
- (BOOL)shouldAutorotate
{
//每次旋轉時候去topViewController詢問VC是否需要旋轉
return self.topViewController.shouldAutorotate;
}
- (NSUInteger)supportedInterfaceOrientations
{
//每次旋轉時候去topViewController詢問VC支持的方向
return self.topViewController.supportedInterfaceOrientations;
}
之后run一下,所有頁面都能橫屏了,但是需求是某些頁面旋轉,其他用不著,最好的做法就是聲明一個基類,手動設置關閉旋轉,在需要旋轉的子類了打開就行了(我是這樣做的)
基類設置:
-(UIInterfaceOrientationMask)supportedInterfaceOrientations
{
//當前支持的旋轉類型
return UIInterfaceOrientationMaskAllButUpsideDown;
}
- (BOOL)shouldAutorotate
{
// 是否支持旋轉
return NO;
}
-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
// 默認進去類型
return UIInterfaceOrientationPortrait;
}
之后在需要旋轉的子類設置shouldAutorotate為YES就ok了。
run一下,你會發現,其他頁面不會旋轉,需要旋轉的頁面可以旋轉了。
64F465A8-80A2-4E65-9A87-13C0D721E412.jpg
補充一個旋轉時的方法:
- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
if (UIInterfaceOrientationIsPortrait(toInterfaceOrientation)) {
//如果當前是豎屏要完成的事情
}else {
//其他情況完成事情
}
}