你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS開辟中UIPopoverController的應用詳解

iOS開辟中UIPopoverController的應用詳解

編輯:IOS開發綜合

1、簡略引見

1.甚麼是UIPopoverController

是iPad開辟中罕見的一種掌握器(在iPhone上不許可應用)

跟其他掌握器紛歧樣的是,它直接繼續自NSObject,並不是繼續自UIViewController

它只占用部門屏幕空間來出現信息,並且顯示在屏幕的最後面

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452182.png (654×243)

2.應用步調

要想顯示一個UIPopoverController,須要經由以下步調

(1)設置內容掌握器

  因為UIPopoverController直接繼續自NSObject,不具有可視化的才能。是以UIPopoverController下面的內容必需由別的一個繼續自UIViewController的掌握器來供給,這個掌握器稱為“內容掌握器”

 (2)設置內容的尺寸

  顯示出來占領若干屏幕空間

(3)顯示,即從哪一個處所冒出來

 

2、詳細的步調

代碼示例:

新建一個ipad項目,編寫以下代碼: 

新建一個繼續自UITableView的掌握器,讓其作為popoverController的內容掌握器。

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452104.png (528×141)

YYMenuViewController.m文件

//
//  YYMenuViewController.m
//  01-PopoverController簡略引見
//
//  Created by apple on 14-8-17.
//  Copyright (c) 2014年 yangyong. All rights reserved.
//

#import "YYMenuViewController.h"

@interface YYMenuViewController ()
@property(nonatomic,strong)NSArray *menus;
@end


@implementation YYMenuViewController

-(NSArray *)menus
{
    if (_menus==nil) {
        _menus=@[@"列表1",@"列表2",@"列表3",@"列表4"];
    }
 return _menus;
}
- (void)viewDidLoad
{
    [super viewDidLoad];
}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.menus.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *ID=@"ID";
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:ID];
    if (cell==nil) {
        cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
    }
   
    cell.textLabel.text=self.menus[indexPath.row];
    return cell;
}

@end


YYViewController.m文件
//
//  YYViewController.m
//  01-PopoverController簡略引見
//
//  Created by apple on 14-8-17.
//  Copyright (c) 2014年 yangyong. All rights reserved.
//

#import "YYViewController.h"
#import "YYMenuViewController.h"

@interface YYViewController ()
@property(nonatomic,strong)UIPopoverController *popover;
@end

@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    //1.新建一個內容掌握器
    YYMenuViewController *menuVc=[[YYMenuViewController alloc]init];
   
    //2.新建一個popoverController,並設置其內容掌握器
    self.popover=[[UIPopoverController alloc]initWithContentViewController:menuVc];
   
    //3.設置尺寸
    self.popover.popoverContentSize=CGSizeMake(300, 200);
   
    //4.顯示
    [self.popover presentPopoverFromBarButtonItem:self.navigationItem.leftBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
@end

完成後果以下圖:

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452119.png (764×596)

解釋:在storyboard中添加了導航掌握器,並添加了兩個按鈕。

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452152.png (516×362)

3、罕見報錯

在popover的應用進程中,常常會碰到這個毛病

  -[UIPopoverController dealloc] reached while popover is still visible.

毛病的年夜體意思是:popover在仍然可見的時刻被燒毀了(挪用了dealloc)

從毛病可以得出的結論

  當popover仍然可見的時刻,禁絕燒毀popover對象

  在燒毀popover對象之前,必定先讓popover消逝(弗成見)  

如:在上述代碼中,假如不實用全局變量popover,那末將會湧現下面的毛病。

4、設置尺寸
提醒:不建議,像上面如許吧popover的寬度和高度寫逝世。

//1.新建一個內容掌握器
    YYMenuViewController *menuVc=[[YYMenuViewController alloc]init];
   
    //2.新建一個popoverController,並設置其內容掌握器
    self.popover=[[UIPopoverController alloc]initWithContentViewController:menuVc];
   
    //3.設置尺寸
    self.popover.popoverContentSize=CGSizeMake(300, 200);
   
    //4.顯示
    [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的

-(NSArray *)menus
{
    if (_menus==nil) {
        _menus=@[@"列表1",@"列表2",@"列表3",@"列表4",@"列表4",@"列表4",@"列表4",@"列表4",@"列表4",@"列表4",@"列表1",@"列表2",@"列表1",@"列表2"];
    }
 return _menus;
}
- (void)viewDidLoad
{
    [super viewDidLoad];
   
    //設置掌握器未來在popover中的尺寸
    CGFloat maxH=MIN(480,self.menus.count*44);
    //IOS7之前的設置
//    self.contentSizeForVieWinPopover=CGSizeMake(150, maxH);
    //ios7今後
    self.preferredContentSize=CGSizeMake(150, maxH);
   
}

後果:

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452104.png (343×550)

關於MIN(A,B)的解釋,終究的年夜小取決於B,然則最年夜不克不及跨越A,假如跨越A那末值就等於A。

 

5、設置顯示的地位

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參數以下:

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452152.png (542×391)

相干代碼:

//
//  YYViewController.m
//  01-PopoverController簡略引見
//
//  Created by apple on 14-8-17.
//  Copyright (c) 2014年 yangyong. All rights reserved.
//

#import "YYViewController.h"
#import "YYMenuViewController.h"

@interface YYViewController ()<UIPopoverControllerDelegate>
@property(nonatomic,strong)UIPopoverController *popover;
- (IBAction)buttonClick:(UIButton *)sender;
@end


@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
}

-(void)showPopoverFromItem
{
    //1.新建一個內容掌握器
    YYMenuViewController *menuVc=[[YYMenuViewController alloc]init];
   
    //2.新建一個popoverController,並設置其內容掌握器
    self.popover=[[UIPopoverController alloc]initWithContentViewController:menuVc];
   
    //3.設置尺寸
    //    self.popover.popoverContentSize=CGSizeMake(300, 200);
   
    //4.顯示
    [self.popover presentPopoverFromBarButtonItem:self.navigationItem.leftBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
   
    //5.設置署理
    self.popover.delegate=self;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
   
}

#pragma mark-署理辦法
//popoverController消逝的時刻挪用
-(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
}
//popoverController的地位轉變的時刻挪用(如豎屏變橫屏)
-(void)popoverController:(UIPopoverController *)popoverController willRepositionPopoverToRect:(inout CGRect *)rect inView:(inout UIView *__autoreleasing *)view
{
   
}
//用來決議用戶點擊了蒙版後,popoverController能否可以dismiss,前往YES代表可以,前往NO代表弗成以
-(BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController
{
    return NO;
}
- (IBAction)buttonClick:(UIButton *)sender {
   
    //1.新建一個popoverController並設置其內容掌握器
    YYMenuViewController *menuVc=[[YYMenuViewController alloc]init];
    self.popover=[[UIPopoverController alloc]initWithContentViewController:menuVc];
   
    //2.顯示
    //2.1第一種方法
//    [self.popover presentPopoverFromBarButtonItem:<#(UIBarButtonItem *)#> permittedArrowDirections:<#(UIPopoverArrowDirection)#> animated:<#(BOOL)#>];
    //2.2第二種方法
    [self.popover presentPopoverFromRect:sender.bounds inView:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    //解釋:popover會指向sender.bounds這一塊矩形框,這塊矩形框以sender的左上角為坐標原點
    //留意:留意sender.frame和sender.bounds的差別
   
}
@end

界面後果:(部門)

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452106.png (475×407)

關於frame坐標盤算的圖示:

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452124.png (269×217)

上面二者是等價的:

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452116.png (773×88)

即假如想讓箭頭指向某一個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];

6、設置署理

署理對象

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

能否可見

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

箭頭偏向

  @property (nonatomic, readonly) UIPopoverArrowDirection popoverArrowDirection;

封閉popover(讓popover消逝)

  - (void)dismissPopoverAnimated:(BOOL)animated;

代碼解釋:

.......
  //5.設置署理
    self.popover.delegate=self;
}

#pragma mark-署理辦法
//popoverController消逝的時刻挪用
-(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
}
//popoverController的地位轉變的時刻挪用(如豎屏變橫屏)
-(void)popoverController:(UIPopoverController *)popoverController willRepositionPopoverToRect:(inout CGRect *)rect inView:(inout UIView *__autoreleasing *)view
{
   
}
//用來決議用戶點擊了蒙版後,popoverController能否可以dismiss,前往YES代表可以,前往NO代表弗成以
-(BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController
{
    return NO;
}

7、避免點擊UIPopoverController區域外消逝

默許情形下

只需UIPopoverController顯示在屏幕上,UIPopoverController面前的一切控件默許是不克不及跟用戶停止正常交互的

點擊UIPopoverController區域外的控件,UIPopoverController默許會消逝

 

要想點擊UIPopoverController區域外的控件時不讓UIPopoverController消逝,處理方法是設置passthroughViews屬性

@property (nonatomic, copy) NSArray *passthroughViews;

這個屬性是設置當UIPopoverController顯示出來時,哪些控件可以持續跟用戶停止正常交互。如許的話,點擊區域外的控件就不會讓UIPopoverController消逝了

代碼示例:

- (IBAction)buttonClick:(UIButton *)sender {
   
    //1.新建一個popoverController並設置其內容掌握器
    YYMenuViewController *menuVc=[[YYMenuViewController alloc]init];
    self.popover=[[UIPopoverController alloc]initWithContentViewController:menuVc];
   
    //設置過濾失落一些控件
    self.popover.passthroughViews=@[self.switchview];
   
    //2.顯示
    //2.1第一種方法
//    [self.popover presentPopoverFromBarButtonItem:<#(UIBarButtonItem *)#> permittedArrowDirections:<#(UIPopoverArrowDirection)#> animated:<#(BOOL)#>];
    //2.2第二種方法
//    [self.popover presentPopoverFromRect:sender.bounds inView:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    [self.popover presentPopoverFromRect:sender.frame inView:sender.superview permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    //解釋:popover會指向sender.bounds這一塊矩形框,這塊矩形框以sender的左上角為坐標原點
    //留意:留意sender.frame和sender.bounds的差別
   
}

彌補:

UIPopoverController這個類是只能用在iPad中的

要想在iPhone中完成popover後果,必需得自界說view,可以參考

【iOS開辟中UIPopoverController的應用詳解】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved