UIPopoverPresentationController简单使用
2015-08-20 10:03
387 查看
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:如果知道哪里有更好的实现,一定要告诉我呀!!!!
相关文章推荐
- UVA 11045-My T-shirt suits me(二分图匹配)
- UIElementCollection
- dpkg: error processing package bluez (--configure) 解决方法
- 【转载】使用SoapUI 测试Web Service
- 后台UI模板开发规范
- NGUI sprite 裁剪到其他图片sprite
- UITableView总结
- Algorithms—128.Longest Consecutive Sequence
- Handler详解(二)---关联到非UI线程
- 详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别
- UITextView 监听点击了returnKey 的方法
- Qt:将quick的控件图像保存为QImage
- iOS UI16_数据持久化
- Xcode环境变量 build Settings 设置
- iOS 9学习系列:UIStackView如何让你的开发更简单
- PHP中 include, include_once, require, require_once的区别
- Havok_2014-1-0_Pc_Xs_User_Guide(2.2.1-创建一个Physics2012对象)
- IOS开发UI阶段 第六周
- iOS开发笔记--iphone练习之手势识别(双击、捏、旋转、拖动、划动、长按)UITapGestureRecognize
- poj 1679 The Unique MST 【次小生成树+100的小数据量】