• iOS开发UI篇—popoverController使用注意


    iOS开发UI篇—popoverController使用注意

    一、设置尺寸

    提示不建议,像下面这样吧popover的宽度和高度写死。

     1 //1.新建一个内容控制器
     2     YYMenuViewController *menuVc=[[YYMenuViewController alloc]init];
     3     
     4     //2.新建一个popoverController,并设置其内容控制器
     5     self.popover=[[UIPopoverController alloc]initWithContentViewController:menuVc];
     6     
     7     //3.设置尺寸
     8     self.popover.popoverContentSize=CGSizeMake(300, 200);
     9     
    10     //4.显示
    11     [self.popover presentPopoverFromBarButtonItem:self.navigationItem.leftBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

    更好的设计是:popover的尺寸应该由内部控制器的内容所决定。

    内容控制器可以自行设置自己在popover中显示的尺寸,其中有两种方法:

    (1)在iOS 7之前  @property (nonatomic,readwrite) CGSize contentSizeForViewInPopover;

    (2)从iOS 7开始  @property (nonatomic) CGSize preferredContentSize;

      以上属性都是UIViewController的

     1 -(NSArray *)menus
     2 {
     3     if (_menus==nil) {
     4         _menus=@[@"列表1",@"列表2",@"列表3",@"列表4",@"列表4",@"列表4",@"列表4",@"列表4",@"列表4",@"列表4",@"列表1",@"列表2",@"列表1",@"列表2"];
     5     }
     6  return _menus;
     7 }
     8 - (void)viewDidLoad
     9 {
    10     [super viewDidLoad];
    11     
    12     //设置控制器将来在popover中的尺寸
    13     CGFloat maxH=MIN(480,self.menus.count*44);
    14     //ios7以前的设置
    15 //    self.contentSizeForViewInPopover=CGSizeMake(150, maxH);
    16     //ios7以后
    17     self.preferredContentSize=CGSizeMake(150, maxH);
    18     
    19 }

    效果:

      

    关于MIN(A,B)的说明,最终的大小取决于B,但是最大不能超过A,如果超过A那么值就等于A。

    二、设置显示的位置

    1.设置显示的位置有2种方法

    (1)围绕着一个UIBarButtonItem显示(箭头指定那个UIBarButtonItem)

    - (void)presentPopoverFromBarButtonItem:(UIBarButtonItem *)item permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections animated:(BOOL)animated;

    item :围绕着哪个UIBarButtonItem显示

    arrowDirections :箭头的方向

    animated :是否通过动画显示出来

     

    (2)围绕着某一块特定区域显示(箭头指定那块特定区域)

    - (void)presentPopoverFromRect:(CGRect)rect inView:(UIView *)view permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections animated:(BOOL)animated;

    rect :指定箭头所指区域的矩形框范围(位置和尺寸),以view的左上角为坐标原点

    view :rect参数是以view的左上角为坐标原点(0,0)

    arrowDirections :箭头的方向

    animated :是否通过动画显示出来

    rect和view参数如下:

    相关代码:

     1 //
     2 //  YYViewController.m
     3 //  01-PopoverController简单介绍
     4 //
     5 //  Created by apple on 14-8-17.
     6 //  Copyright (c) 2014年 yangyong. All rights reserved.
     7 //
     8 
     9 #import "YYViewController.h"
    10 #import "YYMenuViewController.h"
    11 
    12 @interface YYViewController ()<UIPopoverControllerDelegate>
    13 @property(nonatomic,strong)UIPopoverController *popover;
    14 - (IBAction)buttonClick:(UIButton *)sender;
    15 @end
    16 
    17 @implementation YYViewController
    18 
    19 - (void)viewDidLoad
    20 {
    21     [super viewDidLoad];
    22 }
    23 
    24 -(void)showPopoverFromItem
    25 {
    26     //1.新建一个内容控制器
    27     YYMenuViewController *menuVc=[[YYMenuViewController alloc]init];
    28     
    29     //2.新建一个popoverController,并设置其内容控制器
    30     self.popover=[[UIPopoverController alloc]initWithContentViewController:menuVc];
    31     
    32     //3.设置尺寸
    33     //    self.popover.popoverContentSize=CGSizeMake(300, 200);
    34     
    35     //4.显示
    36     [self.popover presentPopoverFromBarButtonItem:self.navigationItem.leftBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    37     
    38     //5.设置代理
    39     self.popover.delegate=self;
    40 }
    41 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    42 {
    43     
    44 }
    45 
    46 #pragma mark-代理方法
    47 //popoverController消失的时候调用
    48 -(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
    49 {
    50 }
    51 //popoverController的位置改变的时候调用(如竖屏变横屏)
    52 -(void)popoverController:(UIPopoverController *)popoverController willRepositionPopoverToRect:(inout CGRect *)rect inView:(inout UIView *__autoreleasing *)view
    53 {
    54     
    55 }
    56 //用来决定用户点击了蒙版后,popoverController是否可以dismiss,返回YES代表可以,返回NO代表不可以
    57 -(BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController
    58 {
    59     return NO;
    60 }
    61 - (IBAction)buttonClick:(UIButton *)sender {
    62     
    63     //1.新建一个popoverController并设置其内容控制器
    64     YYMenuViewController *menuVc=[[YYMenuViewController alloc]init];
    65     self.popover=[[UIPopoverController alloc]initWithContentViewController:menuVc];
    66     
    67     //2.显示
    68     //2.1第一种方式
    69 //    [self.popover presentPopoverFromBarButtonItem:<#(UIBarButtonItem *)#> permittedArrowDirections:<#(UIPopoverArrowDirection)#> animated:<#(BOOL)#>];
    70     //2.2第二种方式
    71     [self.popover presentPopoverFromRect:sender.bounds inView:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    72     //说明:popover会指向sender.bounds这一块矩形框,这块矩形框以sender的左上角为坐标原点
    73     //注意:注意sender.frame和sender.bounds的区别
    74     
    75 }
    76 @end

    界面效果:(部分)

      

    关于frame坐标计算的图示:

          

    下面两者是等价的:

      

    即如果想让箭头指向某一个UIView的做法有2种做法,比如指向一个button

    方法1

      [popover presentPopoverFromRect:button.bounds inView:button permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];

    方法2

      [popover presentPopoverFromRect:button.frame inView:button.superview permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];

    三、设置代理

    代理对象

      @property (nonatomic, assign) id <UIPopoverControllerDelegate> delegate;

    是否可见

      @property (nonatomic, readonly, getter=isPopoverVisible) BOOL popoverVisible;

    箭头方向

      @property (nonatomic, readonly) UIPopoverArrowDirection popoverArrowDirection; 

    关闭popover(让popover消失)

      - (void)dismissPopoverAnimated:(BOOL)animated;

    代码说明:

     1   .......
     2   //5.设置代理
     3     self.popover.delegate=self;
     4 }
     5 
     6 #pragma mark-代理方法
     7 //popoverController消失的时候调用
     8 -(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
     9 {
    10 }
    11 //popoverController的位置改变的时候调用(如竖屏变横屏)
    12 -(void)popoverController:(UIPopoverController *)popoverController willRepositionPopoverToRect:(inout CGRect *)rect inView:(inout UIView *__autoreleasing *)view
    13 {
    14     
    15 }
    16 //用来决定用户点击了蒙版后,popoverController是否可以dismiss,返回YES代表可以,返回NO代表不可以
    17 -(BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController
    18 {
    19     return NO;
    20 }

    四、防止点击UIPopoverController区域外消失

    默认情况下

    只要UIPopoverController显示在屏幕上,UIPopoverController背后的所有控件默认是不能跟用户进行正常交互的

    点击UIPopoverController区域外的控件,UIPopoverController默认会消失

    要想点击UIPopoverController区域外的控件时不让UIPopoverController消失,解决办法是设置passthroughViews属性

    @property (nonatomic, copy) NSArray *passthroughViews;

    这个属性是设置当UIPopoverController显示出来时,哪些控件可以继续跟用户进行正常交互。这样的话,点击区域外的控件就不会让UIPopoverController消失了

    代码示例:

     1 - (IBAction)buttonClick:(UIButton *)sender {
     2     
     3     //1.新建一个popoverController并设置其内容控制器
     4     YYMenuViewController *menuVc=[[YYMenuViewController alloc]init];
     5     self.popover=[[UIPopoverController alloc]initWithContentViewController:menuVc];
     6     
     7     //设置过滤掉一些控件
     8     self.popover.passthroughViews=@[self.switchview];
     9     
    10     //2.显示
    11     //2.1第一种方式
    12 //    [self.popover presentPopoverFromBarButtonItem:<#(UIBarButtonItem *)#> permittedArrowDirections:<#(UIPopoverArrowDirection)#> animated:<#(BOOL)#>];
    13     //2.2第二种方式
    14 //    [self.popover presentPopoverFromRect:sender.bounds inView:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    15     [self.popover presentPopoverFromRect:sender.frame inView:sender.superview permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    16     //说明:popover会指向sender.bounds这一块矩形框,这块矩形框以sender的左上角为坐标原点
    17     //注意:注意sender.frame和sender.bounds的区别
    18     
    19 }

    补充

    UIPopoverController这个类是只能用在iPad中的

    要想在iPhone中实现popover效果,必须得自定义view,可以参考

    http://code4app.com/ios/Popover-View-in-iPhone/4fa931bd06f6e78d0f000000

    http://code4app.com/ios/Popup-Menu/512231ac6803fa9e08000000

  • 相关阅读:
    简单的模板解析函数
    HTML通过事件传递参数到js 二 event
    HTML通过事件传递参数到js一
    通过this获取当前点击选项相关数据
    LeetCode 20. 有效的括号(Valid Parentheses)
    LeetCode 459. 重复的子字符串(Repeated Substring Pattern)
    LeetCode 14. 最长公共前缀(Longest Common Prefix)
    LeetCode 168. Excel表列名称(Excel Sheet Column Title)
    LeetCode 171. Excel表列序号(Excel Sheet Column Number) 22
    LeetCode 665. 非递减数列(Non-decreasing Array)
  • 原文地址:https://www.cnblogs.com/wendingding/p/3918204.html
Copyright © 2020-2023  润新知