UIPopoverPresentationController on iPhone with iOS 10

前端 未结 4 622
刺人心
刺人心 2021-01-14 09:05

I\'m trying to display a ViewController as a popover on an iPhone. I have already been through several answers on SO and the rest of the web but none have worked so far. I w

相关标签:
4条回答
  • 2021-01-14 09:18

    Add:

    vc.popoverPresentationController?.delegate = self 
    

    just before the line:

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

    0 讨论(0)
  • 2021-01-14 09:29

    You are connecting delegate after presenting view. How it will return .none from delegate and show as popover. Use this :-

        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)
    
        }
    
    0 讨论(0)
  • 2021-01-14 09:35
    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
        }
    
    
    }
    
    0 讨论(0)
  • 2021-01-14 09:36

    The solutions above no longer work in recent iOS versions 12 and above. To get it working again, override -modalPresentationStyle within the viewController to be presented as a popover and return UIModalPresentationPopover. Additionally provide a popoverPresentationController.delegate, implement adaptivePresentationStyleForPresentationController:traitCollection: and return UIModalPresentationNone.

    @interface PopoverViewController : UIViewController
    @end
    
    @implementation PopoverViewController
    
    - (UIModalPresentationStyle)modalPresentationStyle
    {
        return UIModalPresentationPopover;
    }
    
    @end
    
    @interface ViewController ()<UIPopoverPresentationControllerDelegate>
    @end
    
    @implementation ViewController
    
    - (IBAction)openPopover:(id)sender
    {
        UIViewController* testVC = [[PopoverViewController alloc] init];
        testVC.view.backgroundColor = UIColor.yellowColor;
        UIPopoverPresentationController* popPresenter = [testVC popoverPresentationController];
        popPresenter.permittedArrowDirections = UIPopoverArrowDirectionUp;
        popPresenter.delegate = self;
        popPresenter.sourceView = sender;
        popPresenter.sourceRect = [sender bounds];
        [self presentViewController:testVC animated:YES completion:^{}];
    }
    
    #pragma mark protocol (UIPopoverPresentationControllerDelegate)
    
    - (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller traitCollection:(UITraitCollection *)traitCollection
    {
        return UIModalPresentationNone;
    }
    
    @end
    
    0 讨论(0)
提交回复
热议问题