专业java、php、iOS、C++、网页设计、平面设计、网络营销、游戏开发、前端与移动开发培训机构
通过Storyboard使用Popover
- 在
ViewController
嵌入导航控制器
- 给
ViewController
导航栏
的titleView
添加按钮,设置标题为更多
- 设置
ViewController
导航栏
的Right Bar Button Item
为功能
- 效果如下:
- 添加一个
UITableiViewController
- 将
功能
Bar Button Item
连线到UITableiViewController
, 选择popover presentation
- 设置
UITableiViewController
的内容 - 运行,效果如下:
Popover
出来的控制器尺寸太大了,在执行Popover
跳转的时候来设置UITableiViewController
的大小,给popover
的Segue
设置Identifier
为popoverFunc
- 在
ViewController
中实现prepareForSegue:
方法,并判断如果Segue
是popoverFunc
,就设置目标控制器的大小为160, 88
// 控制器在执行 跳转的时候回调用 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // 点击功能按钮,执行跳转 if ([segue.identifier isEqualToString:@"popoverFunc"]) { segue.destinationViewController.preferredContentSize = CGSizeMake(160, 88); } }
- 运行,效果如下:
- 在添加一个
UITableiViewController
用于更多
按钮的popover
- 将
更多
按钮连线到UITableiViewController
, 选择popover presentation
- 运行,效果如下:
- 发现
popover
出来的位置不对,给popover
的Segue
设置Identifier
为popoverMore
在
ViewController
的prepareForSegue:
方法断如果Segue
是popoverMore
就设置popover
的位置
和大小
// 控制器在执行 跳转的时候回调用 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // 点击功能按钮,执行跳转 if ([segue.identifier isEqualToString:@"popoverFunc"]) { segue.destinationViewController.preferredContentSize = CGSizeMake(160, 88); } else if ([segue.identifier isEqualToString:@"popoverMore"]) { // 获取到 popover 的控制器 UIPopoverPresentationController *popover = segue.destinationViewController.popoverPresentationController; // 设置 popover 的位置 popover.sourceRect = self.navigationItem.titleView.bounds; } }
- 运行效果:
- 发现在
iPad
上运行没有问题,但是在iPhone
上面运行,还是Modal
全屏的效果 在
ViewController
的prepareForSegue:
方法中获取popoverPresentationController
,并且设置当前控制器为代理// 控制器在执行 跳转的时候回调用 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // 获取到 popover 的控制器 UIPopoverPresentationController *popover = segue.destinationViewController.popoverPresentationController; // 设置 popover 的代理 popover.delegate = self; // 点击功能按钮,执行跳转 if ([segue.identifier isEqualToString:@"popoverFunc"]) { segue.destinationViewController.preferredContentSize = CGSizeMake(160, 88); } else if ([segue.identifier isEqualToString:@"popoverMore"]) { // 设置 popover 的位置 popover.sourceRect = self.navigationItem.titleView.bounds; // 设置 popover 的大小 segue.destinationViewController.preferredContentSize = CGSizeMake(200, 176); } }
ViewController
实现UIAdaptivePresentationControllerDelegate
协议,并实现adaptivePresentationStyleForPresentationController:traitCollection:
方法// 不要系统根据设备适应popover样式 - (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller traitCollection:(UITraitCollection *)traitCollection { return UIModalPresentationNone; }
- 在
iPhone
上运行,效果如下: