iOS 开发每天分享优质文章集思广益iOS学习专题

UIPopoverPresentationController的

2018-10-23  本文已影响151人  雪山飞狐_91ae

前言

最近项目中很多地方有一个相同的需求,那就是点击一个按钮的时候在按钮的某一个方向弹出一个视图,这个视图需要带有一个箭头指向,就像下图一样。要实现这个功能,就要用到UIPopoverPresentationController这个类了。


WechatIMG38.jpeg

简介

一个带有箭头的弹出视图从出现到消失的整个过程,都是UIPopoverPresentationController类的实例在管理,UIPopoverPresentationController类的实例管理着弹出视图的外形和其它的一些性质。

我们不需要直接去创建这个类的对象,当我们把这个弹出视图对应的视图控制器的modalPresentationStyle属性设置为UIModalPresentationPopover时,viewcontroller就会拥有一个popoverPresentationController属性,它就是UIPopoverPresentationController类型的,用它来管理这个弹出视图的外形和其它一些性质。

UIPopoverPresentationControllerDelegate

UIPopoverPresentationControllerDelegate对象会通知它的delegate整个弹出视图从弹出到消失的整个过程。下面是其主要的API:
通知delegate视图将要呈现:

- (void)prepareForPopoverPresentation:(UIPopoverPresentationController *)popoverPresentationController;

询问delegate视图是否应该消失

- (BOOL)popoverPresentationControllerShouldDismissPopover:(UIPopoverPresentationController *)popoverPresentationController;

通知delegate视图已经消失

- (void)popoverPresentationControllerDidDismissPopover:(UIPopoverPresentationController *)popoverPresentationController;

相关属性

3E798BC1-2CF1-4634-8859-9EA7515BE1E4.png

简单应用

    TestViewController *testVC = [[TestViewController alloc] init];
    testVC.preferredContentSize = CGSizeMake(150, 150);
    testVC.modalPresentationStyle = UIModalPresentationPopover;
    testVC.popoverPresentationController.delegate = self;
    testVC.popoverPresentationController.sourceView = _button;
    testVC.popoverPresentationController.sourceRect = CGRectMake(0, 0, _button.bounds.size.width / 2.0, _button.bounds.size.height / 2.0);
    testVC.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionLeft;
    testVC.popoverPresentationController.backgroundColor = [UIColor redColor];
    testVC.popoverPresentationController.canOverlapSourceViewRect = NO;
    [self presentViewController:testVC animated:YES completion:^{
        
    }];

注意,这样做的话是无论如何都不能成功显示弹出视图的,我们还需要实现代理的一个方法:

#pragma mark - <UIPopoverPresentationControllerDelegate>
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {
    return UIModalPresentationNone;
}

这样就能成功实现了。

上一篇下一篇

猜你喜欢

热点阅读