開發(fā)過iPad的同學(xué)知道UIPopoverController
,這個可是針對iPad的專用API如果使用在iPhone大多數(shù)會報錯誤禾酱。在AutoLayout的帶領(lǐng)下涣雕,蘋果所有界面在走向統(tǒng)一化四苇,一些API也開始統(tǒng)一已骇,UIPopoverPresentationController
就是這樣的一個東東离钝。
UIPopoverPresentationController
繼承UIPresentationController
,是IOS8新引用的一個類票编,thanks god,蘋果推出了IOS9后設(shè)備的遷移近40%,放棄IOS7的同學(xué)們可以試試這個類了卵渴。
以前如果在iPhone上做一個popOver的效果是比較費(fèi)力的慧域,如果一套UI Code想適配iPhone和iPad在popOver上估計你得這么寫
if(is_iPad){
UIPopoverController ....
}else{
[self presentController...]
}
但是有了UIPopoverPresentationController
后我們就也可以在iPhone來用了。
看一個iPhone上面的效果
這個和iPad上的效果是一樣一樣的±硕粒現(xiàn)在我們可以這么做昔榴,先用storyboard實(shí)現(xiàn)一下
我們到紅色的vc控制器中配置要顯示的效果,默認(rèn)的如果什么都不做在iPad上會popover出來碘橘,但是在iPhone上會以presentModel的方式被呈現(xiàn)出來互订,現(xiàn)在我們配置這個視圖讓它以popover的方式彈出來
- (void)configPopover{
self.modalPresentationStyle = UIModalPresentationPopover;
UIPopoverPresentationController *popvc = self.popoverPresentationController;
popvc.delegate = self;
}
//以下是對UIPopoverPresentationControllerDelegate的實(shí)現(xiàn)
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller traitCollection:(UITraitCollection *)traitCollection{
return UIModalPresentationNone;
}
- (BOOL)popoverPresentationControllerShouldDismissPopover:(UIPopoverPresentationController *)popoverPresentationController{
return YES;
}
注意兩點(diǎn)
- configPopover需要在視圖加載前就做執(zhí)行,可以放到initWithCoder中
- 第一個代理是
UIPresentationControllerDelegate
的代理蛹屿,這里面?zhèn)鬟f了UITraitCollection
,可以根據(jù)方向選擇屁奏,第二個代理可以配置是否要在點(diǎn)視圖以外的地方來dissmiss視圖岩榆。
如果是純code的話可以這么寫
UIViewController *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"byCode"];
if (vc) {
vc.modalPresentationStyle = UIModalPresentationPopover;
UIPopoverPresentationController *popvc = vc.popoverPresentationController;
popvc.permittedArrowDirections = UIPopoverArrowDirectionAny;
popvc.barButtonItem = sender;
popvc.delegate = self;
[self presentViewController:vc animated:YES completion:nil];
}
UIPopoverPresentationController
如果要要彈出需要有一個錨點(diǎn)错负,可以看它的屬性里面有sourceRect,sourceView 均可用來popup視圖。
對于一些簡單的視圖你可以做的很小勇边,可以通過preferredContentSize
設(shè)置要彈出的view的大小犹撒,比如上面的需要添加一句
vc.preferredContentSize = CGSizeMake(200, 200);
,popup出來的view就是一個小方塊粒褒。
總結(jié)一下
- 獲取要彈出的ViewController识颊,設(shè)置他的要彈出的方式
- 設(shè)置彈出的方向,位置奕坟,大小
- 如果想控制默認(rèn)顯示方式祥款,需要實(shí)現(xiàn)ViewController的popoverPresentationController的代理
- 使用
presentViewController
方法彈出