2017-07-24 40 views
2

我試圖定義附加到一個視圖這樣的酥料餅的觀點:iPhone設備上的Popover演示風格 - 可能還有更多嗎?

desired popover appearance

這裏是我的代碼:

class MyController: UIViewController, UIPopoverPresentationControllerDelegate { 

    ... 

    func displaySignOut(_ sender: UIButton) { 
     let vc = UIStoryboard(name: "Main", bundle: nil) 
      .instantiateViewController(withIdentifier: "signOutPopover") 
     vc.modalPresentationStyle = .popover 
     vc.preferredContentSize = CGSize(width: 100, height: 30) 
     present(vc, animated: true, completion: nil) 

     let pc = vc.popoverPresentationController! 
     pc.sourceView = sender 
     pc.sourceRect = sender.bounds 
     pc.delegate = self 
    } 

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

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

由於酥料餅是如此之小,我想在所有設備上使用這種風格。我遵循慣常建議(例如,here),覆蓋adaptivePresentationStyle以返回UIModalPresentationStyle.none

這在iPad設備上正常工作,但在iPhone上,它沒有。在較小的iPhone設備上,它始終全屏顯示。在較大的屏幕上(例如iPhone 7 Plus),出現錯誤,但奇怪的是,如果在彈出窗口出現後旋轉設備,則會切換到縱向顯示(縱向和橫向)。 (如果我解僱了酥料餅,並重提這個話題,這是錯的再次直到我旋轉設備)。此外,在景觀是在一個陌生的配置來了(不是全屏幕縱向):

How the popover appears in landscape on iPhone 7 Plus

與popover演示文稿不同,如果我在popover視圖本身之外輕敲,這並不會消失。

Apple documentation說(部分):

在一個水平緊湊的環境,popovers默認適應UIModalPresentationOverFullScreen表現風格。

「默認」強烈建議有一種方法來覆蓋此行爲。但是(與this post一致),在委託中重寫adaptivePresentationStyle似乎不再是這樣做的方式(雖然它曾經工作過)。那麼是否有新的方法來修改默認行爲?

我使用XCode 8.3.3和Swift 3.1,目標iOS 9+。

回答

1

我已經創建了一個自定義類,裏面的故事板連接按鈕和實現下面的代碼。

import UIKit 
class PopOverViewController: UIViewController { 

    @IBOutlet weak var button: UIButton! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     button.backgroundColor = UIColor.purple 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    //Updating the popover size 
    override var preferredContentSize: CGSize { 
     get { 
      let size = CGSize(width: 80, height: 60) 
      return size 
     } 
     set { 
      super.preferredContentSize = newValue 
     } 
    } 


    //Setup the ViewController for popover presentation 
    func updatePopOverViewController(_ button: UIButton?, with delegate: AnyObject?) { 
     guard let button = button else { return } 
     modalPresentationStyle = .popover 
     popoverPresentationController?.permittedArrowDirections = [.any] 
     popoverPresentationController?.backgroundColor = UIColor.purple 
     popoverPresentationController?.sourceView = button 
     popoverPresentationController?.sourceRect = button.bounds 
     popoverPresentationController?.delegate = delegate 
    } 

} 

後往裏視圖控制器實現的一個函數來顯示在iPhone上 酥料餅

func showPopOver(button: UIButton!) { 
let viewController = PopOverViewController() 
viewController.updatePopOverViewController(button, with: self) 
    present(viewController, animated: true, completion: nil) 
} 

注: - 測試,這應該對人像以及風景模式

工作
+0

這很好。我承認,當我第一次看到它時,我認爲這只是我嘗試過的相同代碼的重組,而且它沒有任何不同。但事實並非如此。你能解釋一下爲什麼這個工作時我的代碼沒有? –

+0

我可以在您設置框架的preferredContentSize上看到問題,但不更新super.preferredContentSize中的值。所以在我的代碼中,我也設置了super.preferredContentSize = newValue。這可能是你案件的原因。這有道理嗎? –

+0

我看到這可能是一個影響尺寸的問題。但是在很多情況下,我的版本甚至沒有提供「popover」風格。這不僅僅是大小錯誤。我想知道爲什麼我的版本失敗,你的工作正常。可以設置大小(或不這樣做)導致整個樣式改變? –