ios-UIPopoverController和UIPopoverPresentationController

UIPopoverController是在ios9的时候废弃了,用UIPopverPresentationController来代替,下面就简单的介绍下这两者的使用方式

首先是UIPopiverController它是继承自NSObject的,也就是说它本身没有显示功能,我们肯定要给它去设置内容,所以它是有一个contentViewController属性的。

使用如下所示

    - (IBAction)MenuClick:(UIBarButtonItem*)sender {
    ZXTableViewController * vc = [[ZXTableViewController alloc]init];
    //禁止tableView的滚动
    vc.tableView.scrollEnabled=NO;
    
    //创建UIPopoverController
    UIPopoverController * popover = [[UIPopoverController alloc]initWithContentViewController:vc];
    
    //设置弹出视图的尺寸
    popover.popoverContentSize = CGSizeMake(375, 44*3);
    //设置从哪边显示出来,Any表示四个方向都可以,系统帮我们判断
    [popover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
上面的使用需要注意的是,我们一定要一开始去创建popover的时候,就应该去使用initWithContentViewController,否则程序会崩溃,会报下面的错误。

效果图


如果是UIPopverPresentationController使用起来就不一样了。下面设置代理的话,self需要去遵守<UIPopoverPresentationControllerDelegate>这个协议

    
  - (IBAction)ButtonClick:(UIButton *)sender {
    //创建控制器 
    ZXTableViewController * vc = [[ZXTableViewController alloc]init];
    //禁止tableView的滚动
    vc.tableView.scrollEnabled=NO;
    //设置大小,这个我们也可以在控制器内部设置,让控制器自己决定
    vc.preferredContentSize = CGSizeMake(300, 300);
    //设置style
    vc.modalPresentationStyle = UIModalPresentationPopover;
    
    //设置弹出的参照视图,rect参数是以view的左上角为坐标原点(0,0)
    vc.popoverPresentationController.sourceView = sender;
    
    //弹出视图的尖参照视图底部的中间的位置,指定箭头所指区域的矩形框范围(位置和尺寸),以view的左上角为坐标原点
    vc.popoverPresentationController.sourceRect = sender.bounds;
    //这里就是去设置可以穿透的view,就是当控制器的view已经弹出来了,后面有蒙版了,我们点击后面的某个view是可以点击的,并且这个控制器的view不会消失
    vc.popoverPresentationController.passthroughViews=@[self.AlertButton];
    //设置弹出视图的箭头方向
    vc.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionUp;
    
    //设置代理
    vc.popoverPresentationController.delegate = self;
    
    [self presentViewController:vc animated:YES completion:nil];
}
这里需要注意的是如果我们设置了modalPresentationStyle为UIModalPresentationPopover这样我们去访问这个popoverPresentationController就会去创建出来,否则就为nil

效果如下所示


在扩展下<UIPopoverPresentationControllerDelegate>中比较常用的代理方法

//点击蒙版popover消失, 默认YES
- (BOOL)popoverPresentationControllerShouldDismissPopover:(UIPopoverPresentationController *)popoverPresentationController{
    return YES;
}

- (void)popoverPresentationControllerDidDismissPopover:(UIPopoverPresentationController *)popoverPresentationController{
    NSLog(@"dismissed");
}
还有一个方法,在ipad下不会调用,在iphone下会调用

//默认弹出覆盖整个屏幕
-(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller{
    return UIModalPresentationNone;
}

在iphone中的如果让上面的方法返回UIModalPresentationNone,那就会充满屏幕,效果图如下所示

如果我们在iphone下想要上面的这个显示的效果,我们还可以添加一个按钮,让这个按钮可以做到dismiss的操作。那我们就要去重写一个方法

-(UIViewController *)presentationController:(UIPresentationController *)controller viewControllerForAdaptivePresentationStyle:
(UIModalPresentationStyle)style
{
    UINavigationController * navigationController = [[UINavigationController alloc]initWithRootViewController:controller
   .presentedViewController];
    
   
    UIBarButtonItem * item = [[UIBarButtonItem alloc]initWithTitle:@"完成" style: UIBarButtonItemStyleDone target:self action:
    @selector(complete)];
    
    navigationController.topViewController.navigationItem.rightBarButtonItem = item;
    
    return navigationController;
}
-(void)complete
{
    [self dismissViewControllerAnimated:YES completion:nil];
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值