<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC=5] * * * * * >原文鏈接 :[Presenting a View Controller](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/PresentingaViewController.html#//apple_ref/doc/uid/TP40007457-CH14-SW1) 在屏幕上顯示視圖控制器有兩種方法:將其嵌入到容器視圖控制器中或直接顯示它。容器視圖控制器提供了一個應用程序的主要導航,但彈出視圖控制器也是一個重要的導航工具。您可以使用直接顯示的方式來在當前的視圖之上顯示一個新的視圖控制器。 通常,當您想要顯示彈出頁面時,你可以直接顯示的方式展示視圖控制器,但是您也可以將它們用于其他目的。 UIViewController 內置支持直接彈出視圖控制器,并可用于所有視圖控制器對象。 可以從任何一個視圖控制器直接彈出另一個視圖控制器,盡管 UIKit 可能會將請求重新路由到不同的視圖控制器。 直接彈出視圖控制器在原始視圖控制器(被稱為顯示中的視圖控制器的)和要被顯示的新視圖控制器(稱為被彈出的視圖控制器)之間創建關系。 這種關系構成了視圖控制器層次結構的一部分,并保持原樣直到視圖控制器被關閉為止。 ### 彈出和過渡過程 直接彈出視圖控制器是一種快速且簡單的方法,可以將新內容添加到屏幕上。 內置于 UIKit 中的彈出機制允許您使用內置或自定義動畫顯示新的視圖控制器。 因為 UIKit 處理所有的工作,所以內置的演示和動畫只需要很少的代碼。只需少許額外的工作, 可以創建自定義彈出效果和動畫,并將其用于任何視圖控制器。 可以通過編程方式或使用 segue 來初始化視圖控制器。 如果在設計時間知道自己的應用導航,那么 segue 初始化彈出效果是最簡單的方法。 對于更動態的頁面,或者在沒有專門的控件來啟動 segue 的情況下,使用 UIViewController 的方法來彈出你的視圖控制器。 #### 彈出樣式 視圖控制器的彈出樣式控制其在屏幕上的外觀。 UIKit 定義了許多標準的彈出樣式,每種風格都有特定的外觀和用途。 可以定義自己的自定義彈出樣式。 在設計應用程序時,請選擇正在嘗試執行的最適合的彈出樣式,并將合適的常量賦值給要彈出的視圖控制器的 `modalPresentationStyle` 屬性。 #### 全屏彈出樣式 全屏彈出樣式覆蓋整個屏幕,防止與下層內容的交互。在橫向的常規環境中,只有一種全屏樣式完全覆蓋了下層內容。其余樣式的內容包含調光或透明度的視圖,能顯示下層視圖控制器的部分視圖內容。在水平緊湊的環境中,全屏彈出會自動適應 `UIModalPresentationFullScreen` 風格并覆蓋所有下層內容。 圖 8-1 顯示了在水平常規環境中使用 `UIModalPresentationFullScreen,UIModalPresentationPageSheet 和 UIModalPresentationFormSheet` 樣式的直接彈出樣式的外觀。 在圖中,左上方的綠色視圖控制器彈出右上角的藍色視圖控制器,每個彈出樣式的結果如下所示。 對于某些彈出樣式,UIKit 會在兩個視圖控制器的內容之間插入調光視圖。 ###### 圖 8-1 全屏彈出樣式 ![](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/Art/VCPG_PresentationStyles%20_fig_8-1_2x.png) > 注意 當使用 `UIModalPresentationFullScreen` 樣式彈出視圖控制器時,UIKit 通常會在轉過渡畫完成后刪除底層視圖控制器的視圖。 您可以通過指定 `UIModalPresentationOverFullScreen` 樣式來防止刪除這些視圖。 當彈出的視圖控制器具有讓底層內容顯示的透明區域時,您可以使用該樣式。 當使用全屏彈出樣式時,調用彈出功能的視圖控制器必須覆蓋整個屏幕。 如果彈出中的視圖控制器沒有覆蓋屏幕,則 UIKit 遍歷控制器層次結構,直到找到一個有效的視圖控制器。 如果找不到填充屏幕的中間視圖控制器,則 UIKit 將使用窗口的根視圖控制器。 #### 彈出窗口的樣式 `UIModalPresentationPopover` 樣式以彈出窗口的樣式顯示視圖控制器的視圖。彈出窗口對于顯示附加信息或與光標、選擇對象相關的項目列表非常有用。在橫向常規環境中,popover 視圖只覆蓋屏幕的一部分,如圖 8-2 所示。在橫向緊湊的環境中,彈窗適應 `UIModalPresentationOverFullScreen` 的默認樣式。點擊彈出窗口外的區域可以自動關閉彈出窗口。 ###### 圖 8-2 彈出窗口顯示樣式 ![](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/Art/VCPG_popover-style_2x.png) 因為彈出窗口在水平緊湊的環境中適應全屏顯示,所以通常需要修改彈出窗口代碼來處理適應。在全屏模式下,需要一種方法來關閉顯示的彈出窗口。可以通過添加一個按鈕,在一個可以關閉的容器視圖控制器中嵌入彈窗,或者改變適應行為本身。 有關如何配置彈出窗口顯示樣式的建議,請參閱 [Presenting a View Controller in a Popover](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/PresentingaViewController.html#//apple_ref/doc/uid/TP40007457-CH14-SW13) 。 #### 當前上下文樣式 `UIModalPresentationCurrentContext` 樣式覆蓋了界面中的特定視圖控制器。 使用上下文樣式時,通過將其 `defineDesentationContext` 屬性設置為 `YES` 來指定要覆蓋的視圖控制器。 圖 8-3 顯示了一個當前上下文彈出效果,它只包含一個分割視圖控制器的一個子視圖控制器。 ###### 圖 8-3 當前上下文彈出樣式 ![](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/Art/VCPG_CurrentContextStyles_2x.png) > 注意 當使用 `UIModalPresentationFullScreen` 樣式彈出視圖控制器時, UIKit 通常會在過渡動畫完成后刪除底層視圖控制器的視圖。 您可以通過指定 `UIModalPresentationOverCurrentContext` 樣式來防止刪除這些視圖。 當被彈出的視圖控制器具有讓底層內容顯示的透明區域時,您可以使用該樣式。 定義彈出上下文的視圖控制器也可以定義在彈出過程中使用的過渡動畫。 通常,UIKit 使用被彈出的視圖控制器的 `modalTransitionStyle` 屬性中的值來在屏幕上動畫視圖控制器。 如果表示上下文視圖控制器將其 `ProvidePresentationContextTransitionStyle` 設置為 YES,則 UIKit 將使用該視圖控制器的 `modalTransitionStyle` 屬性中的值。 當轉換到水平緊湊環境時,當前上下文樣式適應 `UIModalPresentationFullScreen` 樣式。 要更改該行為,請使用自適應表示委托來指定不同的彈出樣式或視圖控制器。 #### 自定義彈出樣式 `UIModalPresentationCustom` 風格允許使用定義的自定義樣式彈出視圖控制器。 創建自定義樣式涉及到 `UIPresentationController` 的子類化,并使用其方法來將任何自定義視圖動畫到屏幕上,并設置彈出的視圖控制器的大小和位置。 彈出控制器還處理由于所彈出的視圖控制器的特性的變化而發生的任何改動。 有關如何定義自定義彈出控制器的信息,請參閱 [Creating Custom Presentations](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/DefiningCustomPresentations.html#//apple_ref/doc/uid/TP40007457-CH25-SW1) 。 #### 過渡樣式 過渡樣式決定用于顯示呈現的視圖控制器的動畫類型。 對于內置過渡樣式,可以將其中一種標準過渡樣式分配給要呈現的視圖控制器的 `modalTransitionStyle` 屬性。彈出視圖控制器時,UIKit 會創建與該樣式相對關的動畫。例如,圖 8-4 說明了標準的從下彈出過渡樣式(UIModalTransitionStyleCoverVertical)如何用動畫方式將視圖控制器顯示在屏幕上。 視圖控制器 B 從屏幕下邊開始并且在視圖控制器 A 的上一層進行動畫。當視圖控制器 B 被關閉時,動畫反轉,以便 B 向下滑動以顯示 A . ###### 圖 8-4 視圖控制器的過渡動畫 ![](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/Art/VCPG_SlideTransition_fig_8-1_2x.png) 可以使用 animator 對象和 transitioning delegate 建自定義轉場。 animator 對象創建用于將視圖控制器置于屏幕上的過渡動畫。 transitioning delegate 在適當的時候將 animator 對象提供給 UIKit 。 有關如何實現自定義轉場的信息,請參閱[ Customizing the Transition Animations](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/CustomizingtheTransitionAnimations.html#//apple_ref/doc/uid/TP40007457-CH16-SW1) 。 #### 彈出和顯示視圖控制器對比 UIViewController 提供了兩種顯示視圖控制器的方法: ~~~ - (void)showViewController:(UIViewController *)vc sender:(id)sender; - (void)showDetailViewController:(UIViewController *)vc sender:(id)sender; ~~~ * 這倆方法為顯示視圖控制器提供了最合適和最靈活的方式。這些方法讓顯示中的視圖控制器決定如何最好地處理彈出效果。例如,容器視圖控制器可以將視圖控制器作為一個子節點,而不是以彈出方式呈現。默認行為以彈出方式呈現視圖控制器。 * ` presentViewController:animated:completion: ` 默認以彈出方式顯示視圖控制器。 調用此方法的視圖控制器可能最終不處理彈出過程,但默認是彈出。 這種方法適合水平緊湊環境的顯示風格。` showViewController:sender:` 和 ` showDetailViewController:sender:` 方法是初始化彈出效果的首選方式。視圖控制器可以在不知道視圖控制器層次結構的其他部分或當前視圖控制器在該層次結構中的位置的情況下調用它們。這些方法也使得在應用程序的不同部分重用視圖控制器變得更加容易,而無需編寫有條件的代碼路徑。 ### 彈出視圖控制器 有幾種方法可以啟動視圖控制器的顯示: * 使用 segue 自動顯示視圖控制器。 segue 使用您在 Interface Builder 中指定的信息來實例化并呈現視圖控制器。 有關如何配置 segues 的更多信息,請參閱使用 [Segues](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/UsingSegues.html#//apple_ref/doc/uid/TP40007457-CH15-SW1)。 * 使用 `showViewController:sender:` 或 `showDetailViewController:sender:` 方法來顯示視圖控制器。 在自定義視圖控制器中,您可以將這些方法的顯示效果更改為更適合您的視圖控制器的顯示效果。 * 調用 `presentViewController:animated:completion:` 方法以彈出方式呈現視圖控制器。 有關如何關閉使用其中一種技巧呈現的視圖控制器的信息,請參閱 [Dismissing a Presented View Controller](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/PresentingaViewController.html#//apple_ref/doc/uid/TP40007457-CH14-SW10) 。 #### 顯示視圖控制器 當使用 `showViewController:sender:` 或 `showDetailViewController:sender:` 方法時,創建新視圖控制器并在屏幕上顯示的過程很簡單: 1. 創建想要呈現的視圖控制器對象。 在創建視圖控制器時,使用執行其任務需要的數據對其進行初始化 2. 將新視圖控制器的 `modalPresentationStyle` 屬性設置為需要的樣式。 這種樣式可能不會在最后的顯示過程中使用 3. 將視圖控制器的 `modalTransitionStyle` 屬性設置為所需的過渡動畫樣式。 這種樣式可能不會用在最后的動畫中 4. 調用當前視圖控制器的 `showViewController:sender:` 或 `showDetailViewController:sender:` 方法 UIKit 將調用`showViewController:sender:` 或 `showDetailViewController:sender:` 方法轉發給相應的當前顯示中的視圖控制器。 該視圖控制器可以決定如何最好地執行顯示效果,并可以根據需要更改顯示樣式和轉換樣式。 例如,導航控制器可能會將視圖控制器推到其導航堆棧上。 有關顯示視圖控制器和以模態方式顯示視圖控制器之間的區別的信息,請參 [Presenting Versus Showing a View Controller](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/PresentingaViewController.html#//apple_ref/doc/uid/TP40007457-CH14-SW4) 。 #### 以彈出方式顯示視圖控制器 當直接彈出視圖控制器時,您告訴 UIKit 如何顯示新的視圖控制器以及如何在屏幕上顯示動畫: 1. 創建想要呈現的視圖控制器對象。 在創建視圖控制器時,使用執行其任務需要的數據對其進行初始化 2. 將新視圖控制器的 `modalPresentationStyle` 屬性設置為需要的樣式 3. 將視圖控制器的 `modalTransitionStyle` 屬性設置為所需的過渡動畫樣式 4. 調用當前視圖控制器的 `presentViewController:animated:completion:` 方法。 調用 `presentViewController:animated:completion:` 方法的視圖控制器可能不是實際執行彈出顯示效果的視圖控制器。顯示樣式確定如何呈現視圖控制器,包括當前顯示中的視圖控制器所需的特殊屬性。例如,全屏顯示必須由全屏視圖控制器啟動。如果當前呈現的視圖控制器不合適, UIKit 將遍歷視圖控制器層次結構,直到找到一個為止。UIKit 在完成彈出顯示后,會更新受影響視圖控制器的 `presentsViewController` 和 `presentedViewController` 屬性。 清單 8-1 演示了如何以編程方式呈現視圖控制器。當用戶添加新配方時,應用程序會通過提供導航控制器來提示用戶有關配方的基本信息。之所以選擇導航控制器,因為有一個標準的地方放置一個取消和完成按鈕。使用導航控制器還可以方便地在未來擴展新的菜譜界面。 你所要做的就是在導航堆棧上推送新的視圖控制器。 ###### 清單 8-1 以編程方式呈現視圖控制器 ~~~ - (void)add:(id)sender { // Create the root view controller for the navigation controller // The new view controller configures a Cancel and Done button for the // navigation bar. RecipeAddViewController *addController = [[RecipeAddViewController alloc] init]; addController.modalPresentationStyle = UIModalPresentationFullScreen; addController.transitionStyle = UIModalTransitionStyleCoverVertical; [self presentViewController:addController animated:YES completion: nil]; } ~~~ #### 在彈出窗口中顯示視圖控制器 彈出窗口需要額外的配置,才能呈現它們。設置 `modalPresentationStyle` 為 `UIModalPresentationPopover` 后,配置以下相關屬性: * 將視圖控制器的 `preferredContentSize` 屬性設置為所需的大小 * 使用可從視圖控制器的 `popoverPresentationController` 屬性設置彈出窗口錨點 * 設置 `barButtonItem` 屬性 * 將 `sourceView` 和 `sourceRect` 屬性設置為某個視圖中的特定區域。 可以使用 UIPopoverPresentationController 對象根據需要對彈出窗口的外觀進行其他調整。 彈窗顯示視圖控制器還支持可用于在彈出過程中響應更改的委托對象。 例如,當彈出窗口出現,消失或在屏幕上重新定位時,可以使用委托進行響應。有關此對象的更多信息,請參閱 [UIPopoverPresentationController Class Reference](https://developer.apple.com/documentation/uikit/uipopoverpresentationcontroller) 。 ### 關閉一個顯示的視圖控制器 要關閉一個彈出的視圖控制器,請調用顯示中的視圖控制器的 `dismissViewControllerAnimated:completion:` 方法。 也可以在彈出的視圖控制器本身上調用此方法。 當在彈出的視圖控制器上調用該方法時,UIKit 會自動將該請求轉發給顯示中視圖控制器。 在關閉視圖控制器之前,保存視圖控制器中的重要信息。 關閉視圖控制器會將其從視圖控制器層次結構中刪除,并將其視圖從屏幕上移除。 如果沒有強引用來存儲視圖控制器,關閉它將釋放與之關聯的內存。 如果彈出的視圖控制器必須將數據返回給顯示中的視圖控制器,則使用委托設計模式來傳輸。 委托可以更輕松地在應用程序的不同部分重用視圖控制器。 通過委托,彈出的視圖控制器存儲了一個遵守并實現協議中方法的委托對象的引用。 當收集結果時,彈出的視圖控制器在其委托上調用這些方法。 在一個典型的實現中,顯示中的視圖控制器使自己成為彈出的視圖控制器的委托對象。 ### 在不同的 Storyboard 中彈出一個視圖控制器 雖然可以在同一個故事板中的視圖控制器之間創建 segues,但不能在故事板之間創建 segues 。當你想顯示一個存儲在不同故事板中的視圖控制器時,你必須在顯示它之前明確地實例化這個視圖控制器,如清單 8-2 所示。該示例以彈出方式呈現視圖控制器,但可以將其推到導航控制器上或以其他方式顯示。 ###### 清單 8-2 從故事板載入視圖控制器 ~~~ UIStoryboard* sb = [UIStoryboard storyboardWithName:@"SecondStoryboard" bundle:nil]; MyViewController* myVC = [sb instantiateViewControllerWithIdentifier:@"MyViewController"]; // Configure the view controller. // Display the view controller [self presentViewController:myVC animated:YES completion:nil]; ~~~ 在你的應用中,沒有必要創建多個故事板,不過,以下幾種情況多個故事板可能是有用的: * 您有一個大型的開發團隊,將用戶界面的不同部分分配給團隊的不同部分。每個團隊都在不同的故事板文件中擁有用戶界面的一部分,以最小化沖突。 * 購買或創建了預定義視圖控制器類型集合的庫; 這些視圖控制器的內容在庫提供的故事板中定義。 * 需要顯示在外部屏幕上的內容。在這種情況下,可以將所有與備用屏幕相關聯的視圖控制器放在單獨的故事板中。相同場景的另一種模式是編寫自定義的 segue 。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看