--- 以上對(duì)xcode10及以前模擬器都沒問題 ---
成都創(chuàng)新互聯(lián)公司專注于江油企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城網(wǎng)站制作。江油網(wǎng)站建設(shè)公司,為江油等地區(qū)提供建站服務(wù)。全流程按需定制網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)
那么 xCode11 iOS 13 針對(duì)modalStyle推出了新特性,presentViewController的時(shí)候需要強(qiáng)制添加fullScreen的modalStyle,就會(huì)導(dǎo)致在橫屏切換到豎屏的過程中出現(xiàn)一個(gè)詭異的抖動(dòng),那么問題來了,fullScreen到底做了什么,和之前的present 有和區(qū)別呢
這篇文章寫的還是挺詳細(xì)的
A-B 的情況下,用fullScreen的話 會(huì)調(diào)用presentedViewController的viewlayoutsubviews導(dǎo)致重新布局 有一個(gè)切換 閃一下
這里有兩個(gè)方案
fullScreen模式下 在頁面A里攔截一下這種情況下 攔截一下頁面
使用overFullScreen 模式,但這個(gè)模式在橫豎屏下會(huì)引發(fā)一系列連鎖反應(yīng),系統(tǒng)不會(huì)幫你強(qiáng)制豎屏,當(dāng)你presentingViewcontroller里實(shí)現(xiàn)了
相關(guān)代理之后,他能夠根據(jù)當(dāng)前window來實(shí)現(xiàn)頁面的橫豎屏轉(zhuǎn)換,到這里 ,如果你的需求已經(jīng)滿足了,那么恭喜你,你已經(jīng)成功了。下面內(nèi)容可以忽略了~
因?yàn)橛玫搅随I盤和UIMenuController,而這兩個(gè)東西并不在當(dāng)前 application的keywindow上,下面可以看到,而我們要用到的鍵盤和Menu其實(shí)都是依附于UITextEffectsWindow上的
當(dāng)我們使用overFullScreent的style,橫屏進(jìn)入頁面的時(shí)候,系統(tǒng)其實(shí)并不會(huì)將 UITextEffectsWindow 這個(gè)window自動(dòng)旋轉(zhuǎn)為豎屏,系統(tǒng)判定當(dāng)前仍然是橫屏,name鍵盤和menu仍然是按照橫屏的高度去計(jì)算的,這就會(huì)有問題,針對(duì)這種case,目前用了一個(gè)比較迂回(一個(gè)坑一個(gè)坑去填)的解決辦法。
以上希望能夠幫助到有需要的朋友,有問題進(jìn)一步溝通~
在開發(fā)項(xiàng)目的時(shí)候,遇到了一個(gè)問題,就是其中一個(gè)頁面需要強(qiáng)制橫屏,而其他頁面要強(qiáng)制豎屏,然后返回在回到橫屏,總結(jié)了一些人的經(jīng)驗(yàn)給需要的人。
首先在AppDelegate.h里面添加@property(nonatomic,assign)NSInteger allowOrientations; 然后實(shí)現(xiàn)下面的方法。
- (NSUInteger)application:(UIApplication*)application supportedInterfaceOrientationsForWindow(UIWindow*)window{
if(_allowOrientations ==1) {
return UIInterfaceOrientationMaskLandscapeRight;
}
else{
return (UIInterfaceOrientationMaskPortrait);
}
}
最后在需要使用橫豎屏切換的控制器導(dǎo)入Appdelegate.h文件 實(shí)現(xiàn)方法:
- (void)viewDidLoad{
[superviewDidLoad];?
AppDelegate * appDelegate = (AppDelegate *)[UIApplicationsharedApplication].delegate;?
appDelegate.allowRotation =1;
}
返回到上一個(gè)頁面自動(dòng)切換到豎屏:
if([[UIDevicecurrentDevice] respondsToSelector:@selector(setOrientation:)]) {? ?
SEL selector =NSSelectorFromString(@"setOrientation:");
NSInvocation*invocation = [NSInvocationinvocationWithMethodSignature:[UIDeviceinstanceMethodSignatureForSelector:selector]];? ? [invocation setSelector:selector];??
[invocation setTarget:[UIDevicecurrentDevice]];
intval =UIInterfaceOrientationPortrait;??
[invocation setArgument:val atIndex:2];
[invocation invoke];
}
在你想支持橫豎屏的viewController里面重寫兩個(gè)方法:
1
2
3
4
5
6
7
8
9
10
11
// 支持設(shè)備自動(dòng)旋轉(zhuǎn)
- (BOOL)shouldAutorotate
{
return YES;
}
// 支持橫豎屏顯示
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskAll;
}
這樣在這個(gè)viewController中就可以橫豎屏切換了。
注意如果你window的rootViewController是一個(gè)navigationController,可能會(huì)出現(xiàn)以下問題:
你的navigationController只支持豎屏,但是你push到了某個(gè)新的controller中,這個(gè)controller支持橫豎屏,當(dāng)你在新的controller中切換到橫屏后(也有可能在切換到橫屏然后pop回來后),這時(shí)候程序會(huì)閃退,因?yàn)槟愕膎avigationController不支持橫屏。
如果你想解決這個(gè)問題,就需要自己寫一個(gè)UINavigationController的子類,在這個(gè)類中重寫方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
- (BOOL)shouldAutorotate
{
return [self.viewControllers.lastObject shouldAutorotate];
}
- (NSUInteger)supportedInterfaceOrientations
{
return [self.viewControllers.lastObject supportedInterfaceOrientations];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return [self.viewControllers.lastObject preferredInterfaceOrientationForPresentation];
}
然后用這個(gè)類去創(chuàng)建實(shí)例作為window的rootViewController,這樣就可以避免這個(gè)問題了。
前提: APP全局強(qiáng)制豎屏且不支持橫屏!在部分頁面如果打開橫豎屏開關(guān),則支持橫豎屏動(dòng)態(tài)切換;如果關(guān)閉,則需要點(diǎn)擊才能跳轉(zhuǎn)橫屏頁面。
設(shè)備在控制頁面打開橫豎屏開關(guān),即設(shè)備支持橫豎屏動(dòng)態(tài)切換。
下圖做了個(gè)簡(jiǎn)單的gif展現(xiàn),下圖的操作是操作手機(jī)橫豎屏的結(jié)果
下面說一下強(qiáng)制橫屏的處理辦法
強(qiáng)制橫屏就是在設(shè)備僅支持豎屏的前提下
那么問題來了,既然有兩處都可以設(shè)置,那么最終取值以哪一個(gè)為準(zhǔn)呢?
通過測(cè)試發(fā)現(xiàn),如果兩處都設(shè)置了,最終以第二種設(shè)置為(主要)判斷依據(jù);如果第二處未設(shè)置,則以第一處為準(zhǔn)。
只有當(dāng)前window支持某個(gè)方向的旋轉(zhuǎn),才能對(duì)控制器(如UIviewcontroller)進(jìn)行相應(yīng)方向的旋轉(zhuǎn)并達(dá)到想要的效果(內(nèi)容跟著轉(zhuǎn)動(dòng))。
設(shè)置了可旋轉(zhuǎn)的方向之后,就要對(duì)個(gè)別控制器做更細(xì)致的限制了,比如想讓A控制只能豎屏,或者讓B控制器只能橫屏,就需要用到VC的擴(kuò)展方法(系統(tǒng)自帶的)
通過創(chuàng)建一個(gè)新項(xiàng)目,頁面布局如下:
分別自定義了UINavigationcontroller和UIviewcontroller,并重寫了vc旋轉(zhuǎn)相關(guān)的三個(gè)擴(kuò)展方法,將UINavigationcontroller設(shè)置為window的rootviewcontroller
直接啟動(dòng)APP查看旋轉(zhuǎn)方法調(diào)用情況如下:
通過以上打印結(jié)果可以看出,APP啟動(dòng)時(shí),調(diào)用順序?yàn)锳PPdelegate的application:supportedInterfaceOrientationsForWindow: - nav的supportedInterfaceOrientations - nav的shouldAutorotate - vc的supportedInterfaceOrientations
通過以上結(jié)果論證得出結(jié)論:APP在監(jiān)聽到旋轉(zhuǎn)時(shí),會(huì)首先通知window 并執(zhí)行delegate中的supportedInterfaceOrientationsForWindow方法,然后通知rootviewcontroller并執(zhí)行supportedInterfaceOrientations方法,最后通知棧頂vc并執(zhí)行supportedInterfaceOrientations。
以上例子我們發(fā)現(xiàn)只調(diào)用了nav的shouldAutorotate,而棧頂vc的shouldAutorotate方法被忽略了,或許我們可以猜測(cè)出,是否能夠旋轉(zhuǎn)取決于vc的父容器即nav。
此時(shí),我們手動(dòng)旋轉(zhuǎn)模擬器,看看打印結(jié)果如何?
通過以上打印結(jié)果可以看出,手動(dòng)旋轉(zhuǎn)APP時(shí),調(diào)用順序?yàn)锳PPdelegate的application:supportedInterfaceOrientationsForWindow: - nav的supportedInterfaceOrientations - nav的shouldAutorotate
即使,手動(dòng)旋轉(zhuǎn)手機(jī),也沒有調(diào)用vc的shouldAutorotate方法,甚至連vc的supportedInterfaceOrientations方法都沒有調(diào)用,
為了進(jìn)一步驗(yàn)證猜想,我們點(diǎn)擊push按鈕,跳轉(zhuǎn)到另一個(gè)只允許橫屏的自定義vc(LandscapeRightVC),打印結(jié)果如下:
通過打印可以看到只調(diào)用了LandscapeRightVC的旋轉(zhuǎn)方向的方法,而supportedInterfaceOrientations、shouldAutorotate方法均未調(diào)用,但屏幕方向確實(shí)已經(jīng)橫屏了,之所以能夠橫屏?xí)r因?yàn)榇藭r(shí)nav支持橫屏方向,進(jìn)一步驗(yàn)證了以上觀點(diǎn)。
我們?cè)賹?dāng)前nav設(shè)置為只支持豎屏,并且點(diǎn)擊present按鈕,跳轉(zhuǎn)到只支持橫屏的vc看看打印情況:
執(zhí)行順序大致是:
[AppDelegate application:supportedInterfaceOrientationsForWindow:] -
[NavVC supportedInterfaceOrientations] -
[LandscapeRightVC preferredInterfaceOrientationForPresentation] -
[LandscapeRightVC supportedInterfaceOrientations] -
[NavVC shouldAutorotate] -
[LandscapeRightVC shouldAutorotate] -
[LandscapeRightVC supportedInterfaceOrientations]
那么對(duì)于一個(gè)項(xiàng)目中個(gè)別頁面需要橫屏?xí)r,我們大致可以進(jìn)行如下寫法:
假如將rootviewcontroller設(shè)置為tabbar,并將tabbar設(shè)置為只支持豎屏,而將其中一個(gè)item設(shè)置為LandscapeRightVC,打印結(jié)果如下:
順便提一提UIDeviceOrientation(設(shè)備方向)和UIInterfaceOrientation(UI方向)的區(qū)別
當(dāng)前題目:ios開發(fā)橫豎屏,ios怎么把橫屏弄成豎屏
當(dāng)前網(wǎng)址:http://jinyejixie.com/article4/hojpoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、手機(jī)網(wǎng)站建設(shè)、Google、網(wǎng)站改版、小程序開發(fā)、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)