[Swift]彈出式視窗(PopoverView)

1.需要彈出視窗的controller實現UIPopoverPresentationControllerDelegate

如果是iphone的話需要實作這個方法並回傳.none否則popover視窗會預設為全螢幕

extension BaseSideMenuViewController : UIPopoverPresentationControllerDelegate{
    //IOS會自動偵測是iphone還是ipad,如果是iphone的話預設popover會是全螢幕,加上這個func以後會把預設的關閉,照我們寫的視窗大小彈出
    func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
        return .none
    }
}

2.設定點擊事件彈出PopoverView

func menuOnClick(index:Int) {
        let storyboard = UIStoryboard(name: Storyboard.product.rawValue, bundle: nil)
        //找到popoverview的class
        if let popoverController = storyboard.instantiateViewController(withIdentifier: ProductStoryboardController.cartCellMenuViewController.rawValue) as? CartCellMenuViewController {
            //設定刪除鍵點擊事件
            popoverController.index = index
            popoverController.cartCellMenuViewDelegate = self
            //設定popoverview backgroundColor
            let layer = Global.setBackgroundColor(view);
            popoverController.view.layer.insertSublayer(layer, at: 0)
            //設定以 popover 的效果跳轉
            popoverController.modalPresentationStyle = .popover
            //設定indexpath
            let indexpath = IndexPath(item: index, section: 0)
            //設定popover的來源視圖
            popoverController.popoverPresentationController?.sourceView = cartTableView.cellForRow(at: indexpath)
            //下面註解掉的這行可以指定箭頭指的座標
            if let cell = cartTableView.cellForRow(at: indexpath) as? CartTableViewCell{
                print("設定位置")
                popoverController.popoverPresentationController?.sourceView = cell.btnMenu
                popoverController.popoverPresentationController?.sourceRect = cell.btnMenu.bounds
            }
            popoverController.popoverPresentationController?.delegate = self
            //讓 popover 的箭頭指到 rightBarButtonItem。並且方向向上
            popoverController.popoverPresentationController?.permittedArrowDirections = .right
            //設定popover視窗大小
            popoverController.preferredContentSize = CGSize(width: 250, height: 150)
            //跳轉頁面
            present(popoverController, animated: true, completion: nil)
        }
    }

3.參考資料

在 iPhone & iPad 上顯示 popover 彈出視窗
Popovers in iOS
iOS 程式設計 - Popover 視窗