[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 視窗