在Swift中从UIButton创建一个popover

use*_*001 14 uibutton popover ios swift

我想创建有关小酥料饼50x50pxUIButton.我已经看过使用自适应segue的方法,但我的大小类转向因此意味着我不能使用这个功能!

我怎么能创建这个popover?我可以使用按钮内的代码创建它IBACtion吗?或者我还能用故事板做到这一点吗?

Vic*_*ler 12

您可以执行以下两个选项之一:

  • 创建了一个动作UIButton在你UIViewController和现在里面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
    }
    
    Run Code Online (Sandbox Code Playgroud)

    根据@matt 编程iOS 8的书:

    iOS 8中的popover表示控制器是一个表示控制器(UIPresentationController),并且表示控制器是自适应的.这意味着,默认情况下,在水平紧凑的环境中(即在iPhone上),.Popover模态演示样式将被视为.FullScreen.在iPad上显示为popover的内容将在iPhone上显示为全屏显示视图,完全取代界面.

    要避免在iPhone中出现这种情况,您需要adaptivePresentationStyleForPresentationController在您的内部实现委托方法 UIViewController以正确显示Popover.

  • 在我看来,另一种方式更容易做,并且正在使用Interface Builder,只需从中UIButton创建一个segue到ViewController你想要的并在segue中选择Popoversegue.

我希望这对你有帮助.

  • popover在iphone上显示为全屏模式,您可以通过添加此功能来禁用它:`func adaptivePresentationStyleForPresentationController(PC:UIPresentationController!) - > UIModalPresentationStyle {//这*强制*一个弹出窗口将显示在iPhone上返回.None} (3认同)

wm.*_*1us 7

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
        }
    }
Run Code Online (Sandbox Code Playgroud)

请注意,您必须向要作为弹出窗口呈现的一个viewController提供popVC标识符.

希望有所帮助!