效果圖
github鏈接地址:https://github.com/changanli/Popover
簡單介紹
在iOS7.0之前,我們使用UIPopoverController實現popover功能,但僅限制在iPad上使用。在iOS8.0開始,蘋果推出了UIPopoverPresentationController來替代了UIPopoverController,這個新的api可以在iPad和iphone上面同時使用,簡化了通用項目的開發。
按照popover的sourceView的不同,我們將popover分類兩類:一類sourceView是UIBarButtonItem,另一類不是UIBarButtonItem的
popover上面有一個小箭頭,它的參考點的位置是sourceView的左上角,將sourceRect設置成來源是視圖的bounds時,它的箭頭就在中間位置顯示
*注意:
如果想要在iphone上面看到popover的效果,首 先需要取消系統默認的自適應效果,iOS系統會根據設 備的不同來進行自適應,因為自適應的modal模式是從底部彈出來。
popover實現菜單效果的步驟
創建目標控制器
設置目標控制器的Modal類型為了Popover
設置目標控制器的顯示大小
以下步驟必須在modal出目標控制器的監聽事件中進行,否則會出現第一次modal出來是popover,第二次就變成了從底部彈出了
獲取目標控制器的popoverPresentationController
如果不設置背景顏色,小箭頭點擊的時候會出現黑色
給popoverPresentationController設置背景顏色
-
設置popoverPresentationController的sourceView和sourceRect
- sourceView要設置popover依賴于哪個控件
- sourceRect設置popover的參考點的位置
根據sourceView來判斷是否設置barButtonItem
如果sourceView是UIBarButtonItem類型,必須要設置barButtonItem。如果不是,就不用設置了
Modal目標控制器
在代理方法中將自適應類型設置None
代碼實現 Swift3.0 + Xcode8.2.1
class ViewController: UIViewController {
var dest:UIViewController? = nil
override func viewDidLoad() {
super.viewDidLoad()
//1.創建目標控制器
let destVC = UIViewController()
destVC.view.backgroundColor = UIColor.red
//2.設置目標控制器Modal出來的樣式
destVC.modalPresentationStyle = .popover
//3.設置目標控制器Modal出來之后的大小
destVC.preferredContentSize = CGSize(width:100, height: 200)
dest = destVC
let btn = UIButton(frame: CGRect(x: 0, y: 0, width: 40, height: 40))
btn.setTitle("全部", for: .normal)
btn.addTarget(self, action: #selector(ViewController.popover(sender:)), for: .touchUpInside)
btn.setTitleColor(UIColor.orange, for: .normal)
navigationItem.rightBarButtonItem = UIBarButtonItem(customView: btn)
}
func popover(sender:UIButton) {
//4.獲取目標控制器的popoverPresentationController
guard let popoverVC = dest!.popoverPresentationController else {
return
}
//5.給popoverVC設置背景顏色
popoverVC.backgroundColor = UIColor.white
//5.給popoverPresentationController設置代理
popoverVC.delegate = self
//6.設置sourceView和sourceRect
popoverVC.sourceView = sender
popoverVC.sourceRect = sender.bounds
//7.如果sourceView是UIBarButtonItem類型,必須要有下面這一句.這里的sender是UIButton類型的,所已不需要下面這一句
// popoverVC.barButtonItem = UIBarButtonItem(customView: sender)
//8.present目標控制器
present(dest!, animated: true, completion: nil)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
extension ViewController:UIPopoverPresentationControllerDelegate {
//9.在代理方法中將自適應類型設置None
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
return .none
}
}