你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 總結iOS App開辟中掌握屏幕扭轉的幾種方法

總結iOS App開辟中掌握屏幕扭轉的幾種方法

編輯:IOS開發綜合

在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.

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615475699.png (493×56)

2.

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615475652.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,應用 CGAff.netransformMakeRotation 來到達目標,好比:

self.view.transform = CGAff.netransformMakeRotation(M_PI/2) 

上面講授采取第二種方法的各版本手動扭轉:
思惟是起首設置 statusBarOrientation,然後再轉變某個view的偏向跟 statusBarOrientation 分歧!

那既然是扭轉,起碼也得有2個偏向,那末照樣少不了下面說的誰人硬性前提,先在plist外面設置好一切能夠須要扭轉的偏向。既然是手動扭轉,那末就要封閉主動扭轉:

- (BOOL)shouldAutorotate{ 
        return NO; 
}
 
手動觸發某個按鈕,挪用辦法,這個辦法的完成以下:

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight]; 
self.view.transform = CGAff.netransformMakeRotation(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

【總結iOS App開辟中掌握屏幕扭轉的幾種方法】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved