DJTestViewController.m
#import "DJTestViewController.h"
#import "DJColorTableViewController.h" @interface DJTestViewController() <DJColorControllerDelegate> @property (nonatomic,weak) UIButton *btn1;
@property (nonatomic,weak) UIButton *btn2;
@property (nonatomic,strong) UIPopoverController *popVC; @end @implementation DJTestViewController - (void)viewDidLoad { [super viewDidLoad];
self.view.backgroundColor = [UIColor blackColor]; UIButton *btn1 = [[UIButton alloc] init];
btn1.frame = CGRectMake(, , , );
[btn1 setTitle:@"测试" forState:UIControlStateNormal];
[btn1 setBackgroundColor:[UIColor greenColor]];
[self.view addSubview:btn1];
self.btn1 = btn1; [btn1 addTarget:self action:@selector(btn1DidClick:) forControlEvents:UIControlEventTouchUpInside]; UIButton *btn2 = [[UIButton alloc] init];
btn2.backgroundColor = [UIColor redColor];
btn2.frame = CGRectMake(, , , );
[btn2 setTitle:@"测试2" forState:UIControlStateNormal]; [btn2 addTarget:self action:@selector(btn2DidClick:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:btn2];
self.btn2 = btn2; } - (void)btn1DidClick:(UIButton *)btn { DJColorTableViewController *colorVC = [[DJColorTableViewController alloc] init];
colorVC.delegate = self; UIPopoverController *popVC = [[UIPopoverController alloc] initWithContentViewController:colorVC]; // 使popover在弹出时btn2仍然可以被点击
popVC.passthroughViews = @[self.btn2]; [popVC presentPopoverFromRect:CGRectMake(, , , ) inView:[self.btn1 superview] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; self.popVC = popVC; } - (void)btn2DidClick:(UIButton *)btn {
NSLog(@"btn2 被点击"); } // 当popover 里面的CELL被点击时调用此方法
- (void)colorTableViewController:(DJColorTableViewController *)vc didSelectedColor:(UIColor *)color { self.btn1.backgroundColor = color; [self.popVC dismissPopoverAnimated:YES]; } @end
DJColorTableViewController.h
#import <UIKit/UIKit.h> @class DJColorTableViewController;
@protocol DJColorControllerDelegate <NSObject> @optional
- (void)colorTableViewController:(DJColorTableViewController *)vc didSelectedColor:(UIColor *)color; @end @interface DJColorTableViewController : UITableViewController @property (nonatomic,weak) id<DJColorControllerDelegate> delegate; @end
DJColorTableViewController.m
#import "DJColorTableViewController.h" #define DJRandomColor [UIColor colorWithRed:arc4random_uniform(255)/255.0 green:arc4random_uniform(255)/255.0 blue:arc4random_uniform(255)/255.0 alpha:1.0]; static NSUInteger numberOfROws = ; @implementation DJColorTableViewController - (void)viewDidLoad { [super viewDidLoad]; // 取消tableview cell分隔线
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
// 内部决定将来显示在popover里面的宽度和高度
self.preferredContentSize = CGSizeMake(, * numberOfROws); } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return numberOfROws;
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *ID = @"color";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
} cell.backgroundColor = DJRandomColor;
// 取消cell选中状态
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { UIColor *backgroundColor = [tableView cellForRowAtIndexPath:indexPath].backgroundColor; if ([self.delegate respondsToSelector:@selector(colorTableViewController:didSelectedColor:)]) {
[self.delegate colorTableViewController:self didSelectedColor:backgroundColor];
} } @end
UIPopoverController 需要掌握的其它要点:
1. 使popover里面的controller可以自行决定其宽高:
在本例中popover里面的controller就是DJColorTableViewController
self.preferredContentSize = CGSizeMake(, * numberOfROws);
2. 让popover里面的发生的事件可以告诉外面(代理、通知)
3. 使popover消失
[self.popVC dismissPopoverAnimated:YES];
4. 在popover的蒙版弹出时,蒙版后面的按钮仍然可以被点击
// 使popover在弹出时btn2仍然可以被点击
popVC.passthroughViews = @[self.btn2];
5. 使popover可以在任意View的位置被弹出,不仅仅是UIBarButtonItem
[popVC presentPopoverFromRect:CGRectMake(, , , ) inView:[self.btn1 superview] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
方法说明:popover会在指定View的指定位置弹出。
第一个参数frame代表指定的位置。
第二个参数View代表相对于哪个View。
当然了,如果想在btn1 view的下方显示,最简便的写法如下:
[popVC presentPopoverFromRect:self.btn1.bounds inView:self.btn1 permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
苹果这样设计可以方便popover从任何位置弹出。