UIPopoverController以及iOS9以后UIPopPresentationController的使用

来源:互联网 发布:淘宝企业店铺公示入口 编辑:程序博客网 时间:2024/04/30 11:22

/**

 modalPresentationStyle:呈现样式

 

 UIModalPresentationFullScreen 默认样式, 全屏

 UIModalPresentationPageSheet  宽度保持768(横屏宽度),高跟View等高(会除去顶部状态栏)

 UIModalPresentationFormSheet 居中显示, 占用屏幕的一部分 --> pad中较常见

 */


/**

 modalTransitionStyle : 转场样式

 

 UIModalTransitionStyleCoverVertical   垂直覆盖

 UIModalTransitionStyleFlipHorizontal  类似win8的三维翻转效果

 UIModalTransitionStyleCrossDissolve   淡入淡出

 UIModalTransitionStylePartialCurl     翻页效果 --> 电子书类软件常见

 






- (IBAction)buttonClick:(id)sender {

   // iOS8以后的兼容写法

    

    // iOS8的时候,系统将popove作为模态视图的一种呈现样式

    // 当系统检测到设备是iPhone,直接以普通视图弹出

    // 当系统检测到设备是iPad,会以popover弹出

    

    //1. 创建内容控制器

    TableViewController *tableVC = [TableViewControllernew];

    

    //如果是iPhone运行,相当于,自动会自动跳过下面几句代码,达到适配的目的

    //2. 设置模态视图的呈现样式

    tableVC.modalPresentationStyle =UIModalPresentationPopover;

    

    //3. 设置UIPopoverPresentationController

    //iOS8以后, UIViewController,新增了一个属性popoverPresentationController

    UIPopoverPresentationController *popover = tableVC.popoverPresentationController;

    

    //3.1 指向BarButtonItem按钮

//    popover.barButtonItem = self.navigationItem.leftBarButtonItem;

//    popover.permittedArrowDirections = UIPopoverArrowDirectionAny;

    

    //3.2 指向自定义视图 --> 箭头方向可以不设置,默认就是Any

    popover.sourceView = self.blueButton;

    popover.sourceRect = self.blueButton.bounds;

    

    

    //4. 模态视图弹出

    [selfpresentViewController:tableVCanimated:YEScompletion:nil];

    

}


- (void)popoveriOS8

{

    // iOS8以前的兼容写法 -->判断设备的类型

    

    

    //1. 创建内容控制器

    TableViewController *tableVC = [TableViewControllernew];

    

    if ([UIDevicecurrentDevice].userInterfaceIdiom ==UIUserInterfaceIdiomPad ) {

        

        //2. 创建popover

        UIPopoverController *popover = [[UIPopoverControlleralloc]initWithContentViewController:tableVC];

        

        //3. 弹出popover

        [popover presentPopoverFromBarButtonItem:self.navigationItem.leftBarButtonItempermittedArrowDirections:UIPopoverArrowDirectionAnyanimated:YES];

        

    } elseif ([UIDevicecurrentDevice].userInterfaceIdiom ==UIUserInterfaceIdiomPhone) {

        

        // 如果是iPhone, 则使用模态视图弹出即可

        [selfpresentViewController:tableVCanimated:YEScompletion:nil];

    }

}


===========================================

#import "ViewController.h"

#import "TableViewController.h"


@interface ViewController ()<UIPopoverControllerDelegate>


@property (weak, nonatomic) IBOutletUIButton *redButton;

@property (weak, nonatomic) IBOutletUIButton *blueButton;


@end


@implementation ViewController


- (void)viewDidLoad {

    [superviewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

}


//带有箭头指向的弹窗视图,显示在界面的最前面

- (IBAction)categoryClick:(id)sender {

    //1. 创建内容控制器

    TableViewController *tableVC = [TableViewControllernew];

    

    //2. 创建Popover

    UIPopoverController *popover = [[UIPopoverControlleralloc]initWithContentViewController:tableVC];

    

    //3. 显示popover

    [popover presentPopoverFromBarButtonItem:self.navigationItem.leftBarButtonItempermittedArrowDirections:UIPopoverArrowDirectionAnyanimated:YES];

    

    //4. 设置大小 默认大小是320 * 480

    

    //两种方式:

    // . 当前控制器中: popoverContentSize -->不推荐使用

    // . 内容控制器中:preferredContentSize -->应该使用此属性来设置

    popover.popoverContentSize = CGSizeMake(320, 3 * 44);

}



- (IBAction)redViewClick:(id)sender {

    //1. 创建内容控制器

    TableViewController *tableVC = [TableViewControllernew];

    

    UINavigationController *nav = [[UINavigationControlleralloc]initWithRootViewController:tableVC];

    

    //2. 创建Popover

    UIPopoverController *popover = [[UIPopoverControlleralloc]initWithContentViewController:nav];

    

    //3. 显示popover

    //inView : 要指向的视图]

    //Rect : 以指向的视图左上角为(0, 0),然后根据rect参数来定位

    //ArrowDirection: 箭头方向, 一般都传Any,避免界面发生遮挡现象

    [popover presentPopoverFromRect:self.redButton.boundsinView:self.redButtonpermittedArrowDirections:UIPopoverArrowDirectionAnyanimated:YES];

    

    //[popover presentPopoverFromRect:self.redButton.frame inView:self.redButton.superview permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

    

    //4. 处理block

    tableVC.selectColorBlock = ^(UIColor *color) {

        

        //4.1 更改颜色 --> 传值

        self.redButton.backgroundColor = color;

        

        //4.2 消失popover

        //[popover dismissPopoverAnimated:YES];

        

        //5. 更改pooove的大小 -->带动画

        //popover.popoverContentSize = CGSizeMake(100, 800);

        // 不带动画, 可以用方法来实现 -->一般不推荐

        //[popover setPopoverContentSize:CGSizeMake(100, 800) animated:NO];

        

        //6. 更改内容控制器 --> 属性默认不带动画

        UIViewController *vc = [UIViewControllernew];

        vc.view.backgroundColor = [UIColorblueColor];

        popover.contentViewController = vc;

        // 带动画, 可以用方法来实现

        //[popover setContentViewController:vc animated:YES];

        

    };

    

    //7. 设置穿透视图,设置哪些视图在popove显示的时候,仍旧能响应用户的点击事件

    popover.passthroughViews = @[self.blueButton];

    

    //8. 代理

    popover.delegate = self;

}


- (IBAction)blueViewClick:(id)sender {

    NSLog(@"点我啊");

}


#pragma mark 代理方法

// 设置点击背景时, 能否消失popover . 默认就是yes

- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController

{

    return YES;

}


// 完成popove消失时调用 -->可以将一些需要保存的操作,放到这里

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController

{

    NSLog(@"%s",__func__);

}


// 当屏幕旋转的时候会调用

- (void)popoverController:(UIPopoverController *)popoverController willRepositionPopoverToRect:(inoutCGRect *)rect inView:(inoutUIView *__autoreleasing _Nonnull *)view

{

    NSLog(@"%s",__func__);

}

 }


=========================
pop视图中视图压缩的问题:

// 如果AotoLayout勾选了,那么autoresizingMask默认会有跟上面及左边的联系.

    // 所以,当视图发生大小的改变时,就会发生相对应的压缩行为.

    

    //popover默认大小320 * 480 iPad控制器1024 *768

    //当大的控制器,放大较小的控制器中中,就会发生压缩

    

    //autoresizingMask : 自动伸缩

    self.autoresizingMask =UIViewAutoresizingNone;



======================

iOS9中UIPoppresentationController代替UIPopoverController;


@interface ViewController ()<UIPopoverPresentationControllerDelegate>


PopVC *popvc=[[PopVCalloc]init];


    //设置跳转模式为popover模式

    popvc.modalPresentationStyle =UIModalPresentationPopover;

    //获取到UIPopoverPresentationController对象

    UIPopoverPresentationController* con = popvc.popoverPresentationController;

    con.delegate=self;//设置代理

    //设置弹出的基准视图

    con.sourceView =self.popBtn;//以什么为基准

    con.permittedArrowDirectionsUIPopoverArrowDirectionLeft;//箭头的方向

    con.sourceRect=CGRectMake(50,50,10,10);//设置尖头的位置

    //注意:pop显示的大小和con.permittedArrowDirections和con.sourceRect都有关系;


    [selfpresentViewController:popvcanimated:YEScompletion:nil];//弹出pop视图




//调用了这个代理方法可以设置不全频幕显示

-(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller{

    returnUIModalPresentationNone;

}






0 0
原创粉丝点击