(Masonry 底層就是 AutoLayout 的 NSLayoutConstraint)
git
// 三維設備方向 typedef NS_ENUM(NSInteger, UIDeviceOrientation) { UIDeviceOrientationUnknown, UIDeviceOrientationPortrait, // Device oriented vertically, home button on the bottom UIDeviceOrientationPortraitUpsideDown, // Device oriented vertically, home button on the top UIDeviceOrientationLandscapeLeft, // Device oriented horizontally, home button on the right UIDeviceOrientationLandscapeRight, // Device oriented horizontally, home button on the left UIDeviceOrientationFaceUp, // Device oriented flat, face up UIDeviceOrientationFaceDown // Device oriented flat, face down }; // 二維界面方向 typedef NS_ENUM(NSInteger, UIInterfaceOrientation) { UIInterfaceOrientationUnknown = UIDeviceOrientationUnknown, UIInterfaceOrientationPortrait = UIDeviceOrientationPortrait, UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown, UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight, UIInterfaceOrientationLandscapeRight = UIDeviceOrientationLandscapeLeft }; // iOS6 之後引入組合方式 typedef NS_OPTIONS(NSUInteger, UIInterfaceOrientationMask) { UIInterfaceOrientationMaskPortrait = (1 << UIInterfaceOrientationPortrait), UIInterfaceOrientationMaskLandscapeLeft = (1 << UIInterfaceOrientationLandscapeLeft), UIInterfaceOrientationMaskLandscapeRight = (1 << UIInterfaceOrientationLandscapeRight), UIInterfaceOrientationMaskPortraitUpsideDown = (1 << UIInterfaceOrientationPortraitUpsideDown), UIInterfaceOrientationMaskLandscape = (UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight), UIInterfaceOrientationMaskAll = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown), UIInterfaceOrientationMaskAllButUpsideDown = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight), };獲取設備方向:[[UIDevice currentDevice] orientation]
// 返回是否支持屏幕旋轉 - (BOOL)shouldAutorotate { return YES; } // 返回支持的旋轉方向 - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskAll; } // 返回優先顯示的屏幕方向,假設不設置,默認與進入前一個頁面保持一致(注意該方法僅僅對 ModalViewController 有效) - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return UIInterfaceOrientationLandscapeLeft; }
普通狀況下 ChildrenViewController 不單獨設置。與 RootViewController 保持一致。假設特殊場景需要單獨設置,可以經過在 RootViewController 中下放權限。如:NavigationController 可以經過 self.topViewController 下放權限;TabBarController 可以經過 self.selectedViewController 下放權限。但是要注意,即便下放了權限,ChildrenViewController 仍是必須遵照 Info.plist 和 AppDelegate 中的設置。
(5)假設存在彈出的 ModalViewController,則不受限於步驟4中的 RootViewController,僅僅依據 Info.plist、AppDelegate 及其自身所支持的旋轉設置決定是否旋轉。假設 ModalViewController 是通過包裝的還有一個 RootViewController。則與步驟4原理相似。
github
在 Info.plist 中鎖死指定方向。限制屏幕旋轉。
(2)應用統一支持多個方向本身主動旋轉。在 Info.plist 中設置應用支持的方向,每個頁面進行對應的本身主動旋轉佈局適配。ide
(3)應用不一樣頁面支持的方向不一致。在 Info.plist 中設置所有頁面支持的方向的並集。在 RootViewController 中將權限下放,由頁面但與控制本身的旋轉設置。佈局
適配方式純代碼的話相同建議 Masonry。
演示樣例:SingleRotationDemo
(4)應用場景4:應用支持單一方向,但是個別頁面支持手動控制旋轉。不支持本身主動旋轉。(通常不建議使用,除非特定場景。如視頻播放器頁面限制本身主動旋轉,點擊全屏button後橫屏觀看)
思路:有兩種強制方式旋轉方式,一種是帶導航欄的,一種是不帶導航欄的。具體實現思路演示樣例中有具體描寫敘述。
演示樣例:ForceRotationDemo
post
蘋果官方也是支持這樣的方式。spa