1.UIPopoverController是什么?
它是iPad开发中常见的一种控制器,并且在iphone上是不允许使用。
该控制器直接继承自NSObject,而不是继承自UIViewController,就决定了该控制器不可视。
该控制器占用部分屏幕空间,并且显示在屏幕的最前面
关于上面的说明:虽然该控制器不可视,但是该控制器有contentViewController属性,也说明了该控制器是作为包装其他控制器的父控制器;虽然该控制器暂用部分空间,且显示在屏幕的最前面。但是在屏幕中的其他可交互控件依然可以进行交互,可以说这是一个小小的bug,会影响用户的使用体验。需要我们自己去消除。
2.UIPopoverController怎么使用?
1.创建一个要显示的控制器,也就是UIPopoverController的内容控制器。
//YCMenuController控制器继承自UITableViewController
YCMenuController *menuVC = [[YCMenuController alloc] init]
2.初始化UIPopoverController控制器
_menuPopover = [[UIPopoverController alloc] initWithContentViewController:menuVC];
3.显示该UIPopoverController控制器
- (IBAction)menuClick:(id)sender
//sender是一个按钮
[self.menuPopover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
此外还有另外一种显示方式:
[self.menuPopover presentPopoverFromRect: sender.bounds inView:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
对上面两种方法给出一个具体的说明
//围绕着⼀一个UIBarButtonItem显⽰示(箭头指定那个UIBarButtonItem
//item:围绕哪个UIBarButtonItem显示
//arrowDirections :箭头的⽅方向
//animated :是否通过动画显⽰示出
- (void)presentPopoverFromBarButtonItem:(UIBarButtonItem *)item permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections animated:(BOOL)animated;
//围绕着某⼀块特定区域显⽰(箭头指定那块特定区域)
//rect :指定箭头所指区域的矩形框范围(位置和尺⼨寸)
//view :rect参数是以view的左上⾓角为坐标原点(0,0)
//arrowDirections :箭头的⽅方向
//animated :是否通过动画显⽰示出来
- (void)presentPopoverFromRect:(CGRect)rect inView:(UIView *)view
permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections
animated:(BOOL)animated;
这里要对UIPopoverController有一个强引用。在这里也就是要对_menuPopover有一个强引用。
如果要对显示的popover的尺寸有一个控制,可以在YCMenuController的viewDidLoad方法中添加如下这句代码(iOS7以及后版本):
self.preferredContentSize = CGSizeMake(120, 44);
iOS6或iOS6之前
self.contentSizeForViewInPopover = CGSizeMake(120, 44);
3.可以实现相同效果的UIPopoverPresentationController
该类出现在iOS8中。可以代替UIPopoverController。
它的使用方法:
//在这里定义一个内容控制器
UIViewController *contentVC = [[UIViewController alloc] init];
//contentVC的呈现方式就是通过Popover的方式
contentVC.modalPresentationStyle = UIModalPresentationPopover;
//已经告诉内容控制他的弹出方式就是popover的方式
//所以可以通过内容控制器的popoverPresentationController属性得到UIPopoverPresentationController
UIPopoverPresentationController *popPV = contentVC.popoverPresentationController;
popPV.barButtonItem = self.categoryItem;
[self presentViewController:contentVC animated:YES completion:nil];