iOS:關(guān)于橫豎屏切換的知識(shí)點(diǎn)

iOS16橫豎屏的切換有了新的方式口蝠,正好趕上新的項(xiàng)目要求蚊夫,所以重新整理了一下項(xiàng)目中的橫豎屏切換問題。
項(xiàng)目要求:

  • iPhone整體禁止屏幕旋轉(zhuǎn)只能豎屏孤里,某些特定頁面強(qiáng)制橫屏,某些頁面可以自由旋轉(zhuǎn)革为。
  • iPad整體可以自由旋轉(zhuǎn)扭粱,某些頁面可以強(qiáng)制切換橫豎屏,且切換后當(dāng)前頁面關(guān)閉自由旋轉(zhuǎn)震檩,返回后開啟自由旋轉(zhuǎn)琢蛤。

如何開始橫豎屏切換

1、項(xiàng)目配置:

在Xcode中TARGETS - General - Deployment Info中設(shè)置支持的方向抛虏,例如iPhone設(shè)置只支持豎屏博其,iPad支持全方向,注意iPad情況下需要勾選Requires full screen迂猴,設(shè)置為全屏慕淡,不分屏,否則強(qiáng)制切換屏幕旋轉(zhuǎn)將失效(自己發(fā)現(xiàn)的沸毁,沒有找到相關(guān)解釋峰髓,有大神也可以解釋一下)。如果不配置息尺,只通過AppDelegate中代理方法控制携兵,會(huì)導(dǎo)致啟動(dòng)頁時(shí)不能正常識(shí)別屏幕方向。

Xcode配置.jpg

2搂誉、AppDelegate中的設(shè)置

因?yàn)槟承╉撁嫘枰獜?qiáng)制屏幕切換徐紧,所以通過在AppDelegate實(shí)現(xiàn)代理的方式控制.
AppDelegate.h

/// 通過AppDelegate是實(shí)現(xiàn)旋轉(zhuǎn),解決部分頁面強(qiáng)制旋轉(zhuǎn)
/// 屏幕支持的方法方向
@property (nonatomic, assign) UIInterfaceOrientationMask orientations;

AppDelegate.m

  1. application:didFinishLaunchingWithOptions:中設(shè)置默認(rèn)方向
// 設(shè)置默認(rèn)方向
if (isPad) {
  // ipad
  self.orientations = UIInterfaceOrientationMaskAll;
} else {
  self.orientations = UIInterfaceOrientationMaskPortrait;
}
  1. 實(shí)現(xiàn)代理方法
/// 切換橫豎屏:返回支持方向
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    return self.orientations;
}
  1. 強(qiáng)制切換方向炭懊,且切換后禁止旋轉(zhuǎn)
    例如強(qiáng)制橫屏如下
 // AppDelegate設(shè)置橫屏
    AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate;

    // 當(dāng)前是否橫屏
    if ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeLeft || [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeRight) {
        // 已經(jīng)橫屏并级,AppDelegate中鎖定為當(dāng)前屏幕狀態(tài)
        app.orientations = (1 << [UIApplication sharedApplication].statusBarOrientation);
    } else {
        // 豎屏-強(qiáng)制屏幕橫屏
        // AppDelegate中鎖定為橫屏
        app.orientations = UIInterfaceOrientationMaskLandscapeRight;
        // 強(qiáng)制旋轉(zhuǎn)
        if (@available(iOS 16.0, *)) {
#if defined(__IPHONE_16_0)
            // 避免沒有更新Xcode14的同事報(bào)錯(cuò)
            // iOS16新API,讓控制器刷新方向侮腹,新方向?yàn)樯厦嬖O(shè)置的orientations
            [self setNeedsUpdateOfSupportedInterfaceOrientations];
#endif
        } else {
            // iOS16以下
            NSNumber *orientationPortrait = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeRight];
            [[UIDevice currentDevice] setValue:orientationPortrait forKey:@"orientation"];
        }
    }

在適當(dāng)?shù)奈恢糜浀胕Phone修正方向嘲碧,iPad放開旋轉(zhuǎn)
        // iPhone改為豎屏,具體方式參考橫屏
        // pad放開屏幕方向
        AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate;
        app.orientations = UIInterfaceOrientationMaskAll;
  1. 某個(gè)頁面放開橫豎屏切換凯旋,比如全屏視頻播放時(shí)呀潭。
// 放開
AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate;
app.orientations = UIInterfaceOrientationMaskAll;
// 鎖定
AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate;
app.orientations = UIInterfaceOrientationMaskPortrait;

#這種情況下钉迷,iOS16的強(qiáng)制橫豎屏切換需要添加代碼設(shè)置強(qiáng)制旋轉(zhuǎn),例如:
// 強(qiáng)制屏幕豎屏:手機(jī)
if ([UIApplication sharedApplication].statusBarOrientation != UIInterfaceOrientationPortrait) {
    if (@available(iOS 16.0, *)) {
        // iOS16新API钠署,讓控制器刷新方向糠聪,新方向?yàn)樯厦嬖O(shè)置的orientations
#if defined(__IPHONE_16_0)
        [self setNeedsUpdateOfSupportedInterfaceOrientations];
        NSArray *array = [[[UIApplication sharedApplication] connectedScenes] allObjects];
        UIWindowScene *scene = [array firstObject];
        // 屏幕方向
        UIInterfaceOrientationMask orientation = UIInterfaceOrientationMaskPortrait;
        UIWindowSceneGeometryPreferencesIOS *geometryPreferencesIOS = [[UIWindowSceneGeometryPreferencesIOS alloc] initWithInterfaceOrientations:orientation];
        // 開始切換
        [scene requestGeometryUpdateWithPreferences:geometryPreferencesIOS errorHandler:^(NSError * _Nonnull error) {
            NSLog(@"強(qiáng)制%@錯(cuò)誤:%@", @"橫屏", error);
        }];
#endif
     } else {
          // iOS16以下
          NSNumber *orientationPortrait = [NSNumber numberWithInt:UIInterfaceOrientationPortrait];
          [[UIDevice currentDevice] setValue:orientationPortrait forKey:@"orientation"];
      }
}
  1. 關(guān)于橫豎屏切換的監(jiān)聽
    對(duì)于屏幕旋轉(zhuǎn)的監(jiān)聽,建議監(jiān)聽UIApplicationDidChangeStatusBarOrientationNotification谐鼎,及狀態(tài)欄的方向變化通知舰蟆,這個(gè)收到這個(gè)通知的時(shí)候說明頁面UI已經(jīng)切換了。例如:
// 橫豎屏切換通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleScreenOrientationChange:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
/// 橫豎屏切換通知
- (void)handleScreenOrientationChange:(NSNotification *)noti {
    if ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait || [UIApplication sharedApplication].statusBarOrientation == UIDeviceOrientationPortraitUpsideDown) {
        // 豎屏
    } else {
        // 橫屏
    }
}
注意判斷屏幕方向的時(shí)候一定要用UIInterfaceOrientation:屏幕的方向狸棍,不要錯(cuò)誤的使用的UIDeviceOrientation:設(shè)備的方向身害。

暫時(shí)就這些內(nèi)容。

補(bǔ)充一點(diǎn)草戈,寫代碼的時(shí)候能用Autolayout就盡量用塌鸯,不然突然有一天讓你整個(gè)App適配橫豎屏切換,在原有手機(jī)端代碼基礎(chǔ)上開發(fā)Pad唐片,還有分屏效果丙猬,哭都沒地方。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末费韭,一起剝皮案震驚了整個(gè)濱河市茧球,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌星持,老刑警劉巖抢埋,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異督暂,居然都是意外死亡揪垄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門逻翁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來福侈,“玉大人,你說我怎么就攤上這事卢未。” “怎么了堰汉?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵辽社,是天一觀的道長。 經(jīng)常有香客問我翘鸭,道長滴铅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任就乓,我火速辦了婚禮汉匙,結(jié)果婚禮上拱烁,老公的妹妹穿的比我還像新娘。我一直安慰自己噩翠,他們只是感情好戏自,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伤锚,像睡著了一般擅笔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屯援,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天猛们,我揣著相機(jī)與錄音,去河邊找鬼狞洋。 笑死弯淘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吉懊。 我是一名探鬼主播庐橙,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惕它!你這毒婦竟也來了怕午?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤淹魄,失蹤者是張志新(化名)和其女友劉穎郁惜,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體甲锡,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兆蕉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缤沦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虎韵。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖缸废,靈堂內(nèi)的尸體忽然破棺而出包蓝,到底是詐尸還是另有隱情,我是刑警寧澤企量,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布测萎,位于F島的核電站,受9級(jí)特大地震影響届巩,放射性物質(zhì)發(fā)生泄漏硅瞧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一恕汇、第九天 我趴在偏房一處隱蔽的房頂上張望腕唧。 院中可真熱鬧或辖,春花似錦、人聲如沸枣接。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迄埃。三九已至卵渴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間榆骚,已是汗流浹背片拍。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留妓肢,地道東北人捌省。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像碉钠,于是被迫代替她去往敵國和親纲缓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 基礎(chǔ)概念 UIDeviceOrientation UIDeviceOrientation喊废,表示設(shè)備朝向祝高,可以通過[...
    落影l(fā)oyinglin閱讀 5,279評(píng)論 6 21
  • 目錄 一、最讓人糾結(jié)的三種枚舉 二污筷、兩種屏幕旋轉(zhuǎn)的觸發(fā)方式 三工闺、屏幕旋轉(zhuǎn)控制的優(yōu)先級(jí) 四、開啟屏幕旋轉(zhuǎn)的全局權(quán)限 ...
    來鬧的閱讀 2,873評(píng)論 0 4
  • 目錄一瓣蛀、最讓人糾結(jié)的三種枚舉二陆蟆、兩種屏幕旋轉(zhuǎn)的觸發(fā)方式三、屏幕旋轉(zhuǎn)控制的優(yōu)先級(jí)四惋增、開啟屏幕旋轉(zhuǎn)的全局權(quán)限五叠殷、開啟屏...
    Faner_NG閱讀 4,765評(píng)論 2 18
  • 關(guān)于橫豎屏相關(guān)方法的響應(yīng)都是迷之存在,很難琢磨诈皿,搞的一頭霧水林束。最近項(xiàng)目中正好遇到某個(gè)控制器需要橫屏展示,查閱WWD...
    GoldenChan閱讀 2,417評(píng)論 1 2
  • 關(guān)于橫豎屏適配稽亏,有一句說一句诊县,坑挺深的。之前做Vision和畢設(shè)的時(shí)候就處理過橫豎屏問題措左,不過當(dāng)時(shí)的功力太淺,明顯...
    HarwordLiu閱讀 37,251評(píng)論 26 137