专业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 的大小,给 popoverSegue 设置 IdentifierpopoverFunc
  • ViewController 中实现 prepareForSegue: 方法,并判断如果 SeguepopoverFunc,就设置目标控制器的大小为 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 出来的位置不对,给 popoverSegue 设置 IdentifierpopoverMore
  • ViewControllerprepareForSegue: 方法断如果 SeguepopoverMore 就设置 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 全屏的效果
  • ViewControllerprepareForSegue:方法中获取 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 上运行,效果如下: