美文网首页
Popover在iPhone中的实现

Popover在iPhone中的实现

作者: ImmortalSummer | 来源:发表于2016-05-23 14:56 被阅读0次

popover弹出效果,可以在当前页面中部分的显示另一个控制器,这是在大屏幕的iPad出现后,苹果为了更充分的利用屏幕做出来的一种解决方案,(这样做减少了页面跳转操作).
在7.0及以前,实现方法是使用UIPopoverController的方法,但是这种方法只能使用在iPad设备上,而不能应用到iPhone上(对于不到5寸的屏幕,也确实没有popover的必要).
直到8.0时苹果丧心病狂的出来plus(多少人被打脸,piapia的),手机尺寸达到了5.5寸.苹果随之推出了可以用在iPhone的popover解决方案,就是UIPopoverPresentationController.
UIViewController有一个属性popoverPresentationController,设置该属性可以实现iPhone上的popover效果.


示例代码

去github下载示例代码

以下是要完成的效果:


效果
代码:
#import "ViewController.h"
#import "InfoViewController.h"

@interface ViewController ()<UIPopoverPresentationControllerDelegate>
@property(nonatomic,strong) InfoViewController *infoVC;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor colorWithRed:0.65 green:0.78 blue:0.65 alpha:1];
    
    CGFloat screenW = [UIScreen mainScreen].bounds.size.width;
    
    UIView *box = [[UIView alloc] initWithFrame:CGRectMake(0, 400, screenW, 80)];
    box.backgroundColor = [UIColor colorWithRed:0.65 green:0.85 blue:0.55 alpha:1];
    [self.view addSubview:box];
    
    CGFloat margin = 10;
    int buttonCount = 7;
    for (int i = 0; i<buttonCount; i++) {
        CGFloat buttonW = (screenW - margin)/buttonCount - margin;
        CGFloat buttonX = margin + (buttonW + margin)*i;
        UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(buttonX, margin, buttonW, 80 - margin*2)];
        [button addTarget:self action:@selector(popoverButtonClick:) forControlEvents:UIControlEventTouchUpInside];
        [button setBackgroundColor:[UIColor greenColor]];
        [box addSubview:button];
    }
    
}

-(void)popoverButtonClick:(UIButton *)sender{
    self.infoVC = [[InfoViewController alloc] init];
    //设置弹出的样式为popover
    self.infoVC.modalPresentationStyle = UIModalPresentationPopover;
    //设置弹出控制器的尺寸
    self.infoVC.preferredContentSize = CGSizeMake(200, 30);
    //设置popoverPresentationController的sourceRect和sourceView属性
    self.infoVC.popoverPresentationController.sourceRect = sender.bounds;
    self.infoVC.popoverPresentationController.sourceView = sender;
    //设置箭头方向
    self.infoVC.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionDown;
    //设置北京色,包括箭头
    self.infoVC.popoverPresentationController.backgroundColor = [UIColor orangeColor];
    self.infoVC.popoverPresentationController.delegate = self;
    //弹出
    [self presentViewController:self.infoVC animated:YES completion:nil];
    //显示一秒后消失
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        //关闭popover
        [self dismissViewControllerAnimated:YES completion:nil];
    });
}


//实现该代理方法,返回UIModalPresentationNone值,可以在iPhone设备实现popover效果
-(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller{
    return UIModalPresentationNone;//不适配(不区分ipad或iPhone)
}

@end

总结
popoverPresentationController是UIViewController的一个属性,在控制器vc1中用popover的样式弹出vc2时,
需要设置vc2的以下属性:

  1. vc2的modalPresentationStyle属性为UIModalPresentationPopover.
  2. vc2的preferredContentSize属性,用来确定显示大小.
  3. vc2的popoverPresentationController属性,包括popoverPresentationController的sourceRect, sourceView, permittedArrowDirections, backgroundColor, delegate等属性.
    需要vc1实现UIPopoverPresentationControllerDelegate的代理方法,用来告诉控制器弹出时不需要判断设备类型,无论设备是iPad还是iPhone,都一popover的形式弹出:
-(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller{
      //并返回UIModalPresentationNone
      return UIModalPresentationNone;
}

vc1弹出vc2:

[vc1 presentViewController:vc2 animated:YES completion:nil];

vc1关闭掉弹出来的vc2:

[vc1 dismissViewControllerAnimated:YES completion:nil];

相关文章

网友评论

      本文标题:Popover在iPhone中的实现

      本文链接:https://www.haomeiwen.com/subject/gnparttx.html