web-dev-qa-db-ja.com

SwiftでUIButtonからポップオーバーを作成する

UIButtonから50x50pxに関する小さなポップオーバーを作成したいと思います。アダプティブセグエを使用するメソッドを見てきましたが、サイズクラスがオンになっているため、この機能を使用できません。

他にどのようにこのポップオーバーを作成できますか?ボタンIBACtion内のコードで作成できますか?それとも、ストーリーボードでこれを行う方法はまだありますか?

14
user4671001

次の2つのオプションのいずれかを実行できます。

  • UIButtonUIViewControllerのアクションを作成し、ポップオーバーのようなViewControllerを内部に表示し、UIViewControllerがプロトコルUIPopoverPresentationControllerDelegateを実装する必要がある場合は、次のコードを見てください。

    @IBAction func showPopover(sender: AnyObject) {
    
        var popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier("StoryboardIdentifier") as! UIViewController
    
        popoverContent.modalPresentationStyle = .Popover
        var popover = popoverContent.popoverPresentationController
    
        if let popover = popoverContent.popoverPresentationController {
    
           let viewForSource = sender as! UIView
           popover.sourceView = viewForSource
    
           // the position of the popover where it's showed
           popover.sourceRect = viewForSource.bounds
    
           // the size you want to display
           popoverContent.preferredContentSize = CGSizeMake(200,500)
           popover.delegate = self
        }            
    
        self.presentViewController(popoverContent, animated: true, completion: nil)
    }
    
    func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
       return .None
    }
    

    @mattの本によるとプログラミングiOS 8

    IOS 8のポップオーバープレゼンテーションコントローラーはプレゼンテーションコントローラー(UIPresentationController)であり、プレゼンテーションコントローラーは適応型です。つまり、デフォルトでは、水平方向にコンパクトな環境(iPhoneなど)では、.Popoverモーダルプレゼンテーションスタイルは.FullScreenとして扱われます。 iPadでポップオーバーとして表示されるものは、iPhoneではフルスクリーン表示ビューとして表示され、インターフェースを完全に置き換えます。

    IPhoneでこの動作を回避するには、デリゲートメソッド adaptivePresentationStyleForPresentationControllerUIViewController内に実装して、ポップオーバーを正しく表示する必要があります。

  • 私の意見ではもう1つの方法はより簡単で、Interface Builderを使用して、UIButtonからViewControllerへのセグエを作成し、セグエでPopoverセグエを選択するだけです。

これがお役に立てば幸いです。

12
Victor Sigler

Swift 4これは完全に機能するコードです。したがって、ここに250x250のサイズのポップアップウィンドウが表示されます。

    import UIKit

    class ViewController: UIViewController {

        @IBOutlet weak var button: UIButton!

        override func viewDidLoad() {
            super.viewDidLoad()

// in case if you don't want to make it via IBAction
            button.addTarget(self, action: #selector(tapped), for: .touchUpInside)
        }

        @objc
        private func tapped() {

            guard let popVC = storyboard?.instantiateViewController(withIdentifier: "popVC") else { return }

            popVC.modalPresentationStyle = .popover

            let popOverVC = popVC.popoverPresentationController
            popOverVC?.delegate = self
            popOverVC?.sourceView = self.button
            popOverVC?.sourceRect = CGRect(x: self.button.bounds.midX, y: self.button.bounds.minY, width: 0, height: 0)
            popVC.preferredContentSize = CGSize(width: 250, height: 250)

            self.present(popVC, animated: true)
        }
    }


// This is we need to make it looks as a popup window on iPhone
    extension ViewController: UIPopoverPresentationControllerDelegate {

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

ポップアップとして表示したい1つのviewControllerにpopVC識別子を提供する必要があることに注意してください。

お役に立てば幸いです。

8
wm.p1us

ここでは、ボタンのクリック時にポップオーバーを表示できます。

func addCategory( _ sender : UIButton) {

        var popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier("NewCategory") as UIViewController
        var nav = UINavigationController(rootViewController: popoverContent)
        nav.modalPresentationStyle = UIModalPresentationStyle.Popover
        var popover = nav.popoverPresentationController
        popoverContent.preferredContentSize = CGSizeMake(50,50)
        popover.delegate = self
        popover.sourceView = sender
        popover.sourceRect = sender.bounds

        self.presentViewController(nav, animated: true, completion: nil)

    }
2
Usman Javed

Swift 4バージョン

ストーリーボードからほとんどの作業を行う

私はViewControllerを追加し、その属性インスペクターに行き、「Use Preferred Explicit size」を選択しました。その後、幅と高さの値をそれぞれ50に変更しました。

これが完了したら、Ctrlキーを押しながらボタンからViewControllerにドラッグし、[Present as Popover]を選択して、セグエ識別子に「pop」という名前を付けました。

ButtonのあるViewControllerに行き、次のコードを追加しました。

class FirstViewController: UIViewController, UIPopoverPresentationControllerDelegate {
    @IBOutlet weak var popoverButton: UIButton! // the button

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "pop" {
            let popoverViewController = segue.destination
            popoverViewController.modalPresentationStyle = .popover
            popoverViewController.presentationController?.delegate = self
            popoverViewController.popoverPresentationController?.sourceView = popoverButton
            popoverViewController.popoverPresentationController?.sourceRect  = CGRect(x: 0, y: 0, width: popoverButton.frame.size.width, height: popoverButton.frame.size.height)
        }
    }
    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.none
    }



    override func viewDidLoad() {
        super.viewDidLoad()
    }

}
1
Korpel