簡體   English   中英

為什么“作為彈出框存在”segue 會覆蓋整個屏幕?

[英]Why is 'present as popover' segue covering the whole screen?

在我的項目中,我在屏幕的右下角有一個按鈕,我在情節提要中添加了另一個 uiviewcontroller,將控件拖動到我想要的 uiviewcontroller 作為彈出框,然后將該視圖控制器大小設置為 (300, 300) 並檢查'使用首選的顯式大小'。 當我加載應用程序並單擊按鈕時,整個屏幕都被“彈出窗口”覆蓋。 我還嘗試進入 popoverViewController 的 .m 文件並設置大小,但這也不起作用。
有任何想法嗎?

編輯:因為看起來我必須全屏顯示,這很好,但是我仍然遇到了我之前遇到的其他一些問題。 我的彈出屏幕會出現,我將背景黑色和 alpha 設為 0.5 以使其透明,但它會執行動畫,然后一旦動畫完成,屏幕將從 0.5 不透明度變為完全黑色,唯一的我能看到的是電池圖標。

OP 使用 Objective-C。 這個答案 swift 提供了代碼。 將 swift 轉換為 Objective-C 應該很容易。

在新添加的 ViewController 中,在“Simulated Metrics”下將“Size”更改為“Freeform”,將“Status Bar”更改為“None”。

在“模擬大小”下,將視圖的高度和寬度更改為您希望彈出框內容的實際大小。

為新添加的 VC 創建一個 segue。 使用 segue 類型作為“Present As Popover”並為 segue 命名,例如“popoverSegue”。

在要觸發此 segue 的UIPopoverPresentationControllerDelegate ,添加UIPopoverPresentationControllerDelegate協議。

class ViewController: UIViewController, UIPopoverPresentationControllerDelegate {
}

覆蓋 prepareForSegue 函數以捕獲您的 popover segue。 將 modalPresentationStyle 設置為 .Popover 以明確聲明您想要一個彈出框,然后將視圖的 popoverPresentationController 的委托屬性分配給 self:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "popoverSegue" {
            let popoverViewController = segue.destinationViewController as! UIViewController
            popoverViewController.modalPresentationStyle = UIModalPresentationStyle.Popover
            popoverViewController.popoverPresentationController!.delegate = self
        }
    }

實現adaptivePresentationStyleForPresentationController 函數來告訴你的應用你真的想要那個popover 展示並且不接受替換:

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.None
    }

在這些之后,我可以在 iPhone 上得到一個彈出窗口,它不是全屏而是為 ViewController 設置的大小。

在此處輸入圖片說明

來源:使用 Swift 在 iPhone 上的 iPad Style Popovers

感謝Bharat 的出色回答,我個人使用了一個 UIStoryboardSegue,它的功能幾乎相同。 這樣,我可以在故事板中更改 segue 的類,擁有我想要的東西,而不會污染我的控制器:

class AlwaysPopupSegue : UIStoryboardSegue, UIPopoverPresentationControllerDelegate
{
    override init(identifier: String?, source: UIViewController, destination: UIViewController)
    {
        super.init(identifier: identifier, source: source, destination: destination)
        destination.modalPresentationStyle = UIModalPresentationStyle.popover
        destination.popoverPresentationController!.delegate = self
    }
    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.none
    }
}

斯威夫特 3-5 版本

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "SEGUE_IDENTIFIER" {
            let popoverViewController = segue.destination as! YourViewController
            
            popoverViewController.modalPresentationStyle = UIModalPresentationStyle.popover
            popoverViewController.popoverPresentationController!.delegate = self
        }
    }
    
    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.none
    }
    

斯威夫特 4 版本

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "SegueIdentifier" {
            let popoverViewController = segue.destination
            popoverViewController.modalPresentationStyle = .popover
            popoverViewController.presentationController?.delegate = self
     }
}

不要忘記添加

func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.none
    }

在 iPhone 上,您可以創建一個可以管理所有彈出框的自定義視圖控制器。 由於每個視圖控制器都有自己的導航控制器,您可以將一個新的視圖控制器添加到 app.window.rootviewcontroller 作為 du 視圖並將所有視圖放在前面。

如果你不想自己寫,你可以使用這樣的東西,例如: http : //cocoapods.org/pods/FPPopover

這是 Swift 5 代碼,上面提到的一些/大部分解決方案都是有效的。 這是努力提出完整的解決方案。 這個例子假設你使用了一個用於彈出視圖控制器的 xib 但這也可以工作,例如,為 segue 做准備。 這是一個完整的代碼:

呈現視圖控制器:

let popoverVC = PopoverVC(nibName: "popoverVC", bundle: nil)
popoverVC.completionHandler = { [unowned self] (itemIndex : Int?) in
    if let itemIndex = itemIndex
    {
         // Do completion handling
    }
}

popoverVC.preferredContentSize = CGSize(width: 200, height: 60)
popoverVC.modalPresentationStyle = .popover

if let pvc = popoverVC.popoverPresentationController {
    pvc.permittedArrowDirections = [.down]
    pvc.delegate = self
    pvc.sourceRect = button.frame
    pvc.sourceView = button // Button popover is presented from
    present(popoverVC, animated: true, completion: nil)
}

這個很重要:

extension ViewController: UIPopoverPresentationControllerDelegate {
    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return .none
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM