popover是一種非常好的表現(xiàn)形式,讓用戶輸入一些數(shù)據(jù),進行復(fù)雜的選擇,展示復(fù)雜的數(shù)據(jù),用popover,咱們的App可以活得更滋潤,但是在iOS8之前,popover只能在iPad中使用,iOS8之后,終于可以在iPhone中使用popover了,雖然早就有了第三方的支持,不過自己來實現(xiàn)一下豈不是更好? here we go.
1.新建一個single view application,這個不說了.
2.新建一個viewcontroller,取名叫PopViewController,勾選創(chuàng)建Xib,當(dāng)然在SB中關(guān)聯(lián)一個view controller也是OK的,這里我們用Xib吧.

3.讓ViewController (不是PopViewController啊親們)遵循UIPopoverPresentationControllerDelegate協(xié)議,同時實現(xiàn)adaptivePresentationStyleForPresentationController方法,之后,該文件代碼如下
class ViewController: UIViewController,UIPopoverPresentationControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
}
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
return .None
}
}
4.在SB中拖進去一個Button,并且綁定Outlet和點擊事件,事件的代碼如下
@IBOutlet var btn: UIButton!
@IBAction func btnTap(sender: AnyObject) {
let pop = PopViewController()
pop.modalPresentationStyle = .Popover
pop.popoverPresentationController?.delegate = self
pop.popoverPresentationController?.sourceView = btn
pop.popoverPresentationController?.sourceRect = CGRectZero
self.presentViewController(pop, animated: true, completion: nil)
}
運行,點擊button,會出現(xiàn)效果如下

雖然效果不好,但是至少已經(jīng)有一個彈出的窗口啦,下面來優(yōu)化之
在PopViewController.xib中添加一個segmented control,讓他和屏幕的中心對齊,寬相等,同時設(shè)置View背景色為灰色

修改btnTap方法:
@IBAction func btnTap(sender: AnyObject) {
let pop = PopViewController()
pop.modalPresentationStyle = .Popover
pop.popoverPresentationController?.delegate = self
pop.popoverPresentationController?.sourceView = btn
pop.popoverPresentationController?.sourceRect = btn.bounds
pop.preferredContentSize = CGSizeMake(100, 100)
pop.popoverPresentationController?.permittedArrowDirections = .Down
self.presentViewController(pop, animated: true, completion: nil)
}
運行一下,效果如下

如果不需要箭頭,可以
pop.popoverPresentationController?.permittedArrowDirections = .None
一般常見的popover的顯示方式是點擊navigationItem的時候顯示一個可以滑動的table供用戶選擇,我們來實現(xiàn)一下,過程和上面一樣
實現(xiàn)效果圖:

不帶箭頭的
