UIModalPresentationStyle 各种类型的区别
UIViewController有個屬性modalPresentationStyle,它決定了當(dāng)前控制器 present 出的下一控制器的展示方式。
官方文檔對這些效果有比較詳細(xì)的介紹,這里寫個 demo 幫助理解,demo 在模擬器上運(yùn)行可能會有一點(diǎn)卡頓,真機(jī)沒有影響。
預(yù)備知識
presenting、presented viewController
presentingViewController指的是 present 出當(dāng)前控制器的控制器。
presentedViewController指被當(dāng)前控制器 present 出的控制器。
Size Class
對于各種常見情況的 Size Class 如下幾張圖片所示:
iPhonePlus的SizeClass 普通iPhone的SizeClass 全屏iPad的SizeClassUIModalPresentationStyle
enum UIModalPresentationStyle : Int {case fullScreencase pageSheetcase formSheetcase currentContextcase customcase overFullScreencase overCurrentContextcase popovercase none } 復(fù)制代碼fullScreen
- 在各種 Size Class 情況下都是全屏展示
- 執(zhí)行 present 操作的控制器的view和它的subViews,在 present 完成后都會被從當(dāng)前視圖層級移除
對于水平方向為 compact 的情況,不管用哪種 style 推出其他控制器,presentedViewController都是以fullScreen方式展示。所以剩下的所有類型,都只針對水平方向為 regular 論述。
pageSheet
- 被推出視圖部分的遮蓋下層視圖
- 其寬度總是為該設(shè)備豎屏?xí)r候的寬度(不可變),高度則為當(dāng)前設(shè)備方向的屏幕高度(可變,其實還要去掉狀態(tài)欄的高度)
formSheet
- 被推出視圖大小比屏幕的小,且總是居中顯示
- 在橫屏?xí)r,如果彈出了鍵盤,視圖位置會跟著上移
- 可以設(shè)置被推出視圖的preferredContentSize來設(shè)置它的大小
這里設(shè)置了preferredContentSize = CGSize(width: 200, height: 200)。
currentContext
- 可以用在 iPadUISplitViewController中,指定單獨(dú)覆蓋屏幕單側(cè)的控制器;popover方式展示的控制器,再用該方式 present 出下一視圖
- 在執(zhí)行 present 操作的控制器的控制器層級中往上查找,如果某個控制器的definesPresentationContext == true則它來 present,假如沒有一個為true,那么則由 window.rootController來 present
- 執(zhí)行 present 操作的控制器的view和它的subViews,在 present 完成后都會被從當(dāng)前視圖層級移除
definesPresentationContext默認(rèn)為false,系統(tǒng)提供的一些像UINavigationController的控制器,其默認(rèn)值為true。它的定義為:
A Boolean value that indicates whether this view controller's view is covered when the view controller or one of its descendants presents a view controller.
對于以currentContext方式推出的視圖,如果它的presentedViewController是一個popover,那么推出該視圖的modalTransitionStyle不能是partialCurl,否則會引起崩潰。
currentContext豎屏 currentContext橫屏 currentContextInPopovercustom
A custom view presentation style that is managed by a custom presentation controller and one or more custom animator objects.
詳細(xì)介紹在下篇文章中進(jìn)行。
overFullScreen
基本和fullScreen一致。只是 present 完成后,不會移除執(zhí)行 present 操作的控制器的view和它的subViews。如果presentedViewController.view是有透明度的,底層視圖就可以得以顯示。
overFullScreenoverCurrentContext
基本和currentContext一致。只是 present 完成后,不會移除執(zhí)行 present 操作的控制器的view和它的subViews。如果presentedViewController.view是有透明度的,底層視圖就可以得以顯示。
overCurrentContextpopover
- 在 iPad 上用popover的方式顯示;在 iPhone 上默認(rèn)用fullScreen方式顯示,但是在 iOS8 后可以設(shè)置成popover的方式,在none中會進(jìn)行解釋
- 默認(rèn)情況下,點(diǎn)擊灰色的背景popover會直接消失,通過presentedViewController.popoverPresentationController?.passthroughViews可以配置灰色背景的哪些視圖區(qū)域可以點(diǎn)擊
UIPopoverPresentationController的定義:
An object that manages the display of content in a popover.
當(dāng)視圖被用popover方式 present 的時候,總有一個popoverPresentationController的實例來管理呈現(xiàn)的行為。
popovernone
- 該枚舉值不可以直接賦值給modalPresentationStyle
- popoverPresentationController會調(diào)用它delegate的方法來配置popover的視圖,none只能用在adaptivePresentationStyle(for:)代理方法中返回,告訴popoverPresentationController不要適配presentedViewController,這樣在 iPhone 中也可以用popover的樣式展示了
總結(jié)
以上是生活随笔為你收集整理的UIModalPresentationStyle 各种类型的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 聊聊spring tx的EnableTr
- 下一篇: spring框架 AOP核心详解