popover是一種非常好的表現形式,讓用戶輸入一些數據,進行復雜的選擇,展示復雜的數據,用popover,咱們的App可以活得更滋潤,但是在iOS8之前,popover只能在iPad中使用,iOS8之后,終于可以在iPhone中使用popover了,雖然早就有了第三方的支持,不過自己來實現一下豈不是更好? here we go.
1.新建一個single view application,這個不說了.
2.新建一個viewcontroller
,取名叫PopViewController
,勾選創建Xib,當然在SB中關聯一個view controller也是OK的,這里我們用Xib吧.
3.讓ViewController
(不是PopViewController啊親們)遵循UIPopoverPresentationControllerDelegate
協議,同時實現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,會出現效果如下
雖然效果不好,但是至少已經有一個彈出的窗口啦,下面來優化之
在PopViewController.xib
中添加一個segmented control
,讓他和屏幕的中心對齊,寬相等,同時設置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供用戶選擇,我們來實現一下,過程和上面一樣
實現效果圖:
不帶箭頭的