UIPopoverPresentationController简单使用
来源:互联网 发布:校园网发现代理软件 编辑:程序博客网 时间:2024/05/18 03:11
UIPopoverPresentationController简单使用
在之前如果想要在iphone上实现popover的效果需要自定义view,在iOS8中提供了UIPopoverPresentationController在ipad和iphone两个设备上同时实现popover的效果。找了找网上具体使用的栗子比较少,加上我也是个小菜鸟,所以写着以防我白痴的记忆以后不记得了干着急。如果有不对的地方也请指正~
- 如果要再ControllerA中点击某个按钮弹出模态视图显示ControllerB,那么进行主动弹出的controllerA就是presenting view controller,从名字可看出“主动”。而被弹出的controllerB是presented view controller。
UIPopoverPresentationController
是UIViewController
的一个属性,所以并不需要你特地去建立一个UIPopoverPresentationController
来进行操作,而应该建立一个UIViewController
。- 相关属性
1.sourceRect
:指定箭头所指区域的矩形框范围,以sourceview的左上角为坐标原点
2.permittedArrowDirections
:箭头方向
3.sourceView
:sourceRect以这个view的左上角为原点
4.barButtonItem
:若有navigationController,并且从right/leftBarButtonItem
点击后出现popover,则可以把right/leftBarButtonItem
看做上面说的sourceView.默认箭头指向up,亲测下来up是最合适的方向,所以在这种情况下可以不设置箭头方向。
代码实现的具体效果:点击button出现popover,点击相应的颜色,popover消失,同时背景色会相应改变。
PopoverController:被弹出的Controller
ViewController:主动弹出的Controller
主要代码如下:
PopoverViewController.h
#import "PopoverViewController.h" @implementation PopoverViewController - (void)viewDidLoad { [super viewDidLoad]; self.tableView = [[UITableView alloc] initWithFrame:self.view.frame]; [self.view addSubview:self.tableView]; self.tableView.dataSource = self; self.tableView.delegate = self; self.tableView.scrollEnabled = NO; self.colorArray = [[NSMutableArray alloc] initWithObjects:@"green",@"gray", @"blue",@"purple", @"yellow", nil]; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ //创建消息,在点击相应的颜色时发送,在ViewController中接受消息并做出相应的处理 [[NSNotificationCenter defaultCenter] postNotificationName:@"click" object:indexPath]; } //重写preferredContentSize(iOS7之后)来返回最合适的大小,如果不重写,会返回一整个tableview尽管下面一部分cell是没有内容的,重写后只会返回有内容的部分,我这里还修改了宽,让它窄一点。可以尝试注释这一部分的代码来看效果,通过修改返回的size得到你期望的popover的大小。 - (CGSize)preferredContentSize { if (self.presentingViewController && self.tableView != nil) { CGSize tempSize = self.presentingViewController.view.bounds.size; tempSize.width = 150; //sizeThatFits返回的是最合适的尺寸,但不会改变控件的大小 CGSize size = [self.tableView sizeThatFits:tempSize]; return size; }else { return [super preferredContentSize]; } } - (void)setPreferredContentSize:(CGSize)preferredContentSize{ super.preferredContentSize = preferredContentSize; }
ViewController.h
#import "ViewController.h" #import "PopoverViewController.h" @interface ViewController () @property (strong, nonatomic) UIButton *button; @property (strong, nonatomic) PopoverViewController *firstPopVC; @property (strong, nonatomic) PopoverViewController *secondPopVC; @property (strong, nonatomic) NSString *currentPop; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"item" style:UIBarButtonItemStylePlain target:self action:@selector(rightItemClick)]; self.view.backgroundColor = [UIColor whiteColor]; _button = [[UIButton alloc] initWithFrame:CGRectMake(20, 100, 100, 40)]; [_button setTitle:@"button" forState:UIControlStateNormal]; [_button setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; [self.view addSubview:_button]; [_button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tableDidSelected:) name:@"click" object:nil]; } - (void)rightItemClick{ self.itemPopVC = [[PopoverViewController alloc] init]; self.itemPopVC.modalPresentationStyle = UIModalPresentationPopover; self.itemPopVC.popoverPresentationController.barButtonItem = self.navigationItem.rightBarButtonItem; //rect参数是以view的左上角为坐标原点(0,0) //箭头方向,如果是baritem不设置方向,会默认up,up的效果也是最理想的 self.itemPopVC.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionUnknown; self.itemPopVC.popoverPresentationController.delegate = self; [self presentViewController:self.itemPopVC animated:YES completion:nil]; } //处理popover上的talbe的cell点击 - (void)tableDidSelected:(NSNotification *)notification { NSIndexPath *indexpath = (NSIndexPath *)notification.object; switch (indexpath.row) { case 0: self.view.backgroundColor = [UIColor greenColor]; break; case 1: self.view.backgroundColor = [UIColor grayColor]; break; case 2: self.view.backgroundColor = [UIColor blueColor]; break; case 3: self.view.backgroundColor = [UIColor purpleColor]; break; case 4: self.view.backgroundColor = [UIColor yellowColor]; break; } if (self.buttonPopVC) { //我暂时使用这个方法让popover消失,但我觉得应该有更好的方法,因为这个方法并不会调用popover消失的时候会执行的回调。 [self.buttonPopVC dismissViewControllerAnimated:YES completion:nil]; self.buttonPopVC = nil; }else{ [self.itemPopVC dismissViewControllerAnimated:YES completion:nil]; self.itemPopVC = nil; } } - (void)buttonClick:(UIButton *)sender{ self.buttonPopVC = [[PopoverViewController alloc] init]; self.buttonPopVC.modalPresentationStyle = UIModalPresentationPopover; //rect参数是以view的左上角为坐标原点(0,0) self.buttonPopVC.popoverPresentationController.sourceView = _button; //指定箭头所指区域的矩形框范围(位置和尺寸),以view的左上角为坐标原点 self.buttonPopVC.popoverPresentationController.sourceRect = _button.bounds; //箭头方向 self.buttonPopVC.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionUp; self.buttonPopVC.popoverPresentationController.delegate = self; [self presentViewController:self.buttonPopVC animated:YES completion:nil]; } //UIPopoverPresentationControllerDelegate,只有返回UIModalPresentationNone才可以让popover在手机上按照我们在preferredContentSize中返回的size显示。这是一个枚举,可以尝试换成其他的值尝试。 - (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller{ return UIModalPresentationNone; } - (BOOL)popoverPresentationControllerShouldDismissPopover:(UIPopoverPresentationController *)popoverPresentationController{ //no点击蒙版popover不消失, 默认yes return NO; }
完整的项目地址:git
PS:如果知道哪里有更好的实现,一定要告诉我呀!!!!
0 0
- UIPopoverPresentationController简单使用
- UIPopoverPresentationController的使用
- Iphone上使用UIPopoverPresentationController
- UIPopoverPresentationController的使用
- iOS UIPopoverPresentationController的使用
- UIPopoverPresentationController -
- UIPopoverPresentationController
- UIPopoverPresentationController用法
- 关于UIPopoverPresentationController
- reason: 'UIPopoverPresentationController (<UIPopoverPresentationController: 0x7f223f40>)。。。
- iOS8之UIPopoverPresentationController
- UIPopoverPresentationController 小窗口控制器
- ios-UIPopoverController和UIPopoverPresentationController
- iphone利用UIPopoverPresentationController实现popover
- iOS中UIPopoverPresentationController的用法
- iOS -- UIPopoverPresentationController 实现弹框
- iOS8新特性UIAlertViewController,UISearchController,UIPopoverPresentationController,WKWebView
- UIPopoverPresentationController 弹出 UIViewController 包裹的 UICollectionView
- 播放Android项目工程里的视频文件
- 【二十五】回顾jekyll安装以及简短总结
- 解决SVN Can’t open file ‘/XXX/xxx/db/txn-current-lock’错误
- LDA主题模型的java代码实现
- 第一篇 cocos2d-x学习总结
- UIPopoverPresentationController简单使用
- 支付宝中的return_url和notify_url
- STL的pair
- android不同包引用R.java的问题
- ZOJ 3816 Generalized Palindromic Number (DFS,暴力枚举)
- 整数划分模板
- 如何高效率学习 读书笔记
- 深入浅出的理解框架(Struts2、Hibernate、Spring)与 MVC 设计模式
- Struts2配置事项