2017-05-18 19 views
1

iPhoneでPopoverとしてViewControllerを表示しようとしています。私はすでにSOやその他のウェブ上でいくつかの回答をしてきましたが、これまでに何も働いていませんでした。私はこれをテストする簡単なアプリを書いた。iOS 10を搭載したiPhoneのUIPopoverPresentationController

ViewController.swift:

import UIKit 

class ViewController: UIViewController, UIPopoverPresentationControllerDelegate { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(clicked(_:))) 
    } 

    func clicked(_ sender: Any) { 
     let vc = UIViewController() 
     vc.view.backgroundColor = UIColor.blue 
     vc.preferredContentSize = CGSize(width: 200, height: 200) 
     vc.modalPresentationStyle = .popover 
     present(vc, animated: true, completion: nil) 

     let ppc = vc.popoverPresentationController 
     ppc?.permittedArrowDirections = .any 
     ppc?.delegate = self 
     ppc?.barButtonItem = navigationItem.rightBarButtonItem 
    } 

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

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

ストーリーボードはNavigationControllerに埋め込まれた空のViewControllerを有しています。

これを実行すると、ポップオーバービューコントローラが「完了」ボタンの下に表示されることが予想されました。代わりに、青色のView Controllerがフルスクリーンで表示されます。

この動作を変更する方法はありますか?

+0

vc.popoverPresentationController?.delegate = self 

だけの行の前に例えば ​​'ppc?.sourceView = sender as! UIView' – Bilal

+0

@Bilal line 'ppc?.barButtonItem = navigationItem.rightBarButtonItem'はそのことを処理します。 – mohak

答えて

1

ビューを表示した後で代理人に接続しています。デリゲートから何も返されず、ポップオーバーとして表示されます。これを使用: -

func clicked(_ sender: Any) { 

     let vc = UIViewController() 
     vc.view.backgroundColor = UIColor.blue 
     vc.modalPresentationStyle = .popover 

     vc.preferredContentSize = CGSize(width: 200, height: 200) 

     let ppc = vc.popoverPresentationController 
     ppc?.permittedArrowDirections = .any 
     ppc?.delegate = self 
     ppc?.barButtonItem = navigationItem.rightBarButtonItem 
     ppc?.sourceView = sender 

     present(vc, animated: true, completion: nil) 

    } 
-1

追加:あなたは `sourceView`または` sourceRect`設定する必要が

present(vc, animated: true, completion: nil) 

enter image description here

2
import UIKit 
class ViewController: UIViewController, UIPopoverPresentationControllerDelegate { 

override func viewDidLoad() { 
     super.viewDidLoad() 
     navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(clicked(_:))) 
    } 



func clicked(_ sender: Any) { 
     let vc = UIViewController() 
     vc.view.backgroundColor = UIColor.blue 
     vc.preferredContentSize = CGSize(width: 200, height: 200) 
     vc.modalPresentationStyle = .popover 
     let ppc = vc.popoverPresentationController 
     ppc?.permittedArrowDirections = .any 
     ppc?.delegate = self 
     ppc!.sourceView = sender as? UIView 
     ppc?.barButtonItem = navigationItem.rightBarButtonItem 
     present(vc, animated: true, completion: nil) 
    } 

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


} 
関連する問題