popoverController(iPad)
一、設(shè)置尺寸
提示:不建議,像下面這樣吧popover的寬度和高度寫死。
1 //1.新建一個(gè)內(nèi)容控制器2 YYMenuViewController *menuVc=[[YYMenuViewController alloc]init];3 4 //2.新建一個(gè)popoverController,并設(shè)置其內(nèi)容控制器5 self.popover=[[UIPopoverController alloc]initWithContentViewController:menuVc];6 7 //3.設(shè)置尺寸8 self.popover.popoverContentSize=CGSizeMake(300, 200);9 10 //4.顯示 11 [self.popover presentPopoverFromBarButtonItem:self.navigationItem.leftBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];更好的設(shè)計(jì)是:popover的尺寸應(yīng)該由內(nèi)部控制器的內(nèi)容所決定。
從iOS 7開始 ?@property (nonatomic) CGSize preferredContentSize;
該屬性是UIViewController的
1 -(NSArray *)menus2 {3 if (_menus==nil) {4 _menus=@[@"列表1",@"列表2",@"列表3",@"列表4",@"列表4",@"列表4",@"列表4",@"列表4",@"列表4",@"列表4",@"列表1",@"列表2",@"列表1",@"列表2"];5 }6 return _menus;7 }8 - (void)viewDidLoad9 { 10 [super viewDidLoad]; 11 12 //設(shè)置控制器將來在popover中的尺寸 13 CGFloat maxH=MIN(480,self.menus.count*44); 14 //ios7以前的設(shè)置 15 // self.contentSizeForViewInPopover=CGSizeMake(150, maxH); 16 //ios7以后 17 self.preferredContentSize=CGSizeMake(150, maxH); 18 19 }效果:
關(guān)于MIN(A,B)的說明,最終的大小取決于B,但是最大不能超過A,如果超過A那么值就等于A。
?
二、設(shè)置顯示的位置
1.設(shè)置顯示的位置有2種方法
(1)圍繞著一個(gè)UIBarButtonItem顯示(箭頭指定那個(gè)UIBarButtonItem)
- (void)presentPopoverFromBarButtonItem:(UIBarButtonItem *)item permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections animated:(BOOL)animated;
item :圍繞著哪個(gè)UIBarButtonItem顯示
arrowDirections :箭頭的方向
animated :是否通過動(dòng)畫顯示出來
?
(2)圍繞著某一塊特定區(qū)域顯示(箭頭指定那塊特定區(qū)域)
- (void)presentPopoverFromRect:(CGRect)rect inView:(UIView *)view permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections animated:(BOOL)animated;
rect :指定箭頭所指區(qū)域的矩形框范圍(位置和尺寸),以view的左上角為坐標(biāo)原點(diǎn)
view :rect參數(shù)是以view的左上角為坐標(biāo)原點(diǎn)(0,0)
arrowDirections :箭頭的方向
animated :是否通過動(dòng)畫顯示出來
rect和view參數(shù)如下:
相關(guān)代碼:
1 //2 // YYViewController.m3 // 01-PopoverController簡單介紹4 //5 // Created by apple on 14-8-17.6 // Copyright (c) 2014年 yangyong. All rights reserved.7 //8 9 #import "YYViewController.h" 10 #import "YYMenuViewController.h" 11 12 @interface YYViewController ()<UIPopoverControllerDelegate> 13 @property(nonatomic,strong)UIPopoverController *popover; 14 - (IBAction)buttonClick:(UIButton *)sender; 15 @end 16 17 @implementation YYViewController 18 19 - (void)viewDidLoad 20 { 21 [super viewDidLoad]; 22 } 23 24 -(void)showPopoverFromItem 25 { 26 //1.新建一個(gè)內(nèi)容控制器 27 YYMenuViewController *menuVc=[[YYMenuViewController alloc]init]; 28 29 //2.新建一個(gè)popoverController,并設(shè)置其內(nèi)容控制器 30 self.popover=[[UIPopoverController alloc]initWithContentViewController:menuVc]; 31 32 //3.設(shè)置尺寸 33 // self.popover.popoverContentSize=CGSizeMake(300, 200); 34 35 //4.顯示 36 [self.popover presentPopoverFromBarButtonItem:self.navigationItem.leftBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 37 38 //5.設(shè)置代理 39 self.popover.delegate=self; 40 } 41 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 42 { 43 44 } 45 46 #pragma mark-代理方法 47 //popoverController消失的時(shí)候調(diào)用 48 -(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController 49 { 50 } 51 //popoverController的位置改變的時(shí)候調(diào)用(如豎屏變橫屏) 52 -(void)popoverController:(UIPopoverController *)popoverController willRepositionPopoverToRect:(inout CGRect *)rect inView:(inout UIView *__autoreleasing *)view 53 { 54 55 } 56 //用來決定用戶點(diǎn)擊了蒙版后,popoverController是否可以dismiss,返回YES代表可以,返回NO代表不可以 57 -(BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController 58 { 59 return NO; 60 } 61 - (IBAction)buttonClick:(UIButton *)sender { 62 63 //1.新建一個(gè)popoverController并設(shè)置其內(nèi)容控制器 64 YYMenuViewController *menuVc=[[YYMenuViewController alloc]init]; 65 self.popover=[[UIPopoverController alloc]initWithContentViewController:menuVc]; 66 67 //2.顯示 68 //2.1第一種方式 69 // [self.popover presentPopoverFromBarButtonItem:<#(UIBarButtonItem *)#> permittedArrowDirections:<#(UIPopoverArrowDirection)#> animated:<#(BOOL)#>]; 70 //2.2第二種方式 71 [self.popover presentPopoverFromRect:sender.bounds inView:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 72 //說明:popover會(huì)指向sender.bounds這一塊矩形框,這塊矩形框以sender的左上角為坐標(biāo)原點(diǎn) 73 //注意:注意sender.frame和sender.bounds的區(qū)別 74 75 } 76 @end界面效果:(部分)
關(guān)于frame坐標(biāo)計(jì)算的圖示:
? ??
下面兩者是等價(jià)的:
即如果想讓箭頭指向某一個(gè)UIView的做法有2種做法,比如指向一個(gè)button
方法1
[popover presentPopoverFromRect:button.bounds inView:button permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
方法2
[popover presentPopoverFromRect:button.frame inView:button.superview permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
?
三、設(shè)置代理
代理對(duì)象
@property (nonatomic, assign) id <UIPopoverControllerDelegate> delegate;
是否可見
@property (nonatomic, readonly, getter=isPopoverVisible) BOOL popoverVisible;
箭頭方向
@property (nonatomic, readonly) UIPopoverArrowDirection popoverArrowDirection;?
關(guān)閉popover(讓popover消失)
- (void)dismissPopoverAnimated:(BOOL)animated;
代碼說明:
1 .......2 //5.設(shè)置代理3 self.popover.delegate=self;4 }5 6 #pragma mark-代理方法7 //popoverController消失的時(shí)候調(diào)用8 -(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController9 { 10 } 11 //popoverController的位置改變的時(shí)候調(diào)用(如豎屏變橫屏) 12 -(void)popoverController:(UIPopoverController *)popoverController willRepositionPopoverToRect:(inout CGRect *)rect inView:(inout UIView *__autoreleasing *)view 13 { 14 15 } 16 //用來決定用戶點(diǎn)擊了蒙版后,popoverController是否可以dismiss,返回YES代表可以,返回NO代表不可以 17 -(BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController 18 { 19 return NO; 20 }四、防止點(diǎn)擊UIPopoverController區(qū)域外消失
默認(rèn)情況下
只要UIPopoverController顯示在屏幕上,UIPopoverController背后的所有控件默認(rèn)是不能跟用戶進(jìn)行正常交互的
點(diǎn)擊UIPopoverController區(qū)域外的控件,UIPopoverController默認(rèn)會(huì)消失
?
要想點(diǎn)擊UIPopoverController區(qū)域外的控件時(shí)不讓UIPopoverController消失,解決辦法是設(shè)置passthroughViews屬性
@property (nonatomic, copy) NSArray *passthroughViews;
這個(gè)屬性是設(shè)置當(dāng)UIPopoverController顯示出來時(shí),哪些控件可以繼續(xù)跟用戶進(jìn)行正常交互。這樣的話,點(diǎn)擊區(qū)域外的控件就不會(huì)讓UIPopoverController消失了
代碼示例:
1 - (IBAction)buttonClick:(UIButton *)sender {2 3 //1.新建一個(gè)popoverController并設(shè)置其內(nèi)容控制器4 YYMenuViewController *menuVc=[[YYMenuViewController alloc]init];5 self.popover=[[UIPopoverController alloc]initWithContentViewController:menuVc];6 7 //設(shè)置過濾掉一些控件8 self.popover.passthroughViews=@[self.switchview];9 10 //2.顯示 11 //2.1第一種方式 12 // [self.popover presentPopoverFromBarButtonItem:<#(UIBarButtonItem *)#> permittedArrowDirections:<#(UIPopoverArrowDirection)#> animated:<#(BOOL)#>]; 13 //2.2第二種方式 14 // [self.popover presentPopoverFromRect:sender.bounds inView:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 15 [self.popover presentPopoverFromRect:sender.frame inView:sender.superview permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 16 //說明:popover會(huì)指向sender.bounds這一塊矩形框,這塊矩形框以sender的左上角為坐標(biāo)原點(diǎn) 17 //注意:注意sender.frame和sender.bounds的區(qū)別 18 19 }補(bǔ)充:
UIPopoverController這個(gè)類是只能用在iPad中的
要想在iPhone中實(shí)現(xiàn)popover效果,必須得自定義view,可以參考
http://code4app.com/ios/Popover-View-in-iPhone/4fa931bd06f6e78d0f000000
http://code4app.com/ios/Popup-Menu/512231ac6803fa9e08000000
轉(zhuǎn)載于:https://www.cnblogs.com/yintingting/p/4955899.html
總結(jié)
以上是生活随笔為你收集整理的popoverController(iPad)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构——逆波兰式
- 下一篇: 01_jeecms建站