Как создать Popover ViewController, например Apples One - PullRequest
0 голосов
/ 07 мая 2020

Как я могу создать этот стиль всплывающего окна ViewController в iOS? Как я могу сделать так, чтобы он соответствовал своему содержанию и не выходил за рамки содержимого?

enter image description here

Я пытался изменить modalPresentation на .popover, но он работает только на iPad и macOS, а не на iPhone пока как я пытался. Надеюсь, кому-то поможет

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

Вы должны представить новый ViewController в презентации .popover. Затем вы настраиваете представленный контроллер представления, как хотите. Основной контроллер представления должен выглядеть так:

class ViewController: UIViewController {

    @IBAction func buttonClicked(_ sender: Any) {
        //get the button frame
        /* 1 */
        let button = sender as? UIButton
        let buttonFrame = button?.frame ?? CGRect.zero

        /* 2 */
        //Configure the presentation controller
        let popoverContentController = self.storyboard?.instantiateViewController(withIdentifier: "PopoverContentController") as? PopoverContentController
        popoverContentController?.modalPresentationStyle = .popover

        /* 3 */
        // Present popover
        if let popoverPresentationController = popoverContentController?.popoverPresentationController {
            popoverPresentationController.permittedArrowDirections = .up
            popoverPresentationController.sourceView = self.view
            popoverPresentationController.sourceRect = buttonFrame
            popoverPresentationController.delegate = self
            if let popoverController = popoverContentController {
                present(popoverController, animated: true, completion: nil)
            }
        }
    }
}

extension ViewController: UIPopoverPresentationControllerDelegate {

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

    func popoverPresentationControllerDidDismissPopover(_ popoverPresentationController: UIPopoverPresentationController) {

    }

    func popoverPresentationControllerShouldDismissPopover(_ popoverPresentationController: UIPopoverPresentationController) -> Bool {
        return true
    }
}

PopoverContentController, куда вы, например, добавите свой TableView

class PopoverContentController: UIViewController {

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

    // Custom design&implementation
}
0 голосов
/ 07 мая 2020

Это сработало для меня. Это может вам помочь.

      var dropDownView : DropDownView!

Настроить раскрывающийся список

dropDownView = Storyboard.Main.instantiateViewController(withIdentifier: "DropDownView") as? DropDownView
    self.dropDownView.delegate = self       
    self.dropDownView?.preferredContentSize = CGSize(width: 200, height: CGFloat((dropDownView.listArr.count) * 35))
    let presentationController = AlwaysPresentAsPopover.configurePresentation(forController: self.dropDownView!)
    presentationController.sourceView = sender
    presentationController.sourceRect = sender.bounds
    presentationController.permittedArrowDirections = [.down, .up]
    self.present(self.dropDownView!, animated: true)

// MARK: - Метод делегирования текущего контроллера: открывает раскрывающийся список при щелчке значка «Просмотреть больше»

class AlwaysPresentAsPopover : NSObject, UIPopoverPresentationControllerDelegate {    
private static let sharedInstance = AlwaysPresentAsPopover()

private override init() {
    super.init()
}
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
    return .none
}
static func configurePresentation(forController controller : UIViewController) -> UIPopoverPresentationController {
    controller.modalPresentationStyle = .popover
    let presentationController = controller.presentationController as! UIPopoverPresentationController
    presentationController.delegate = AlwaysPresentAsPopover.sharedInstance
    return presentationController
}
}
...