(一〇六)iPad开发之UIPopoverController的使用
很多App里都有一种点击显示的悬浮气泡菜单,例如下图:
在iPad上可以使用UIPopoverController实现这个功能,popoverController继承自NSObject而不是UIView,这是因为它本身并不能显示,popoverController的显示内容取决于成员属性contentViewController,并且该属性必须在初始化时被传入,否则会崩溃。
popover的尺寸应该由contentView决定,而不应该在外部设置,下面的代码实现了一个contentView,用于popover显示一个类似上图的菜单。
使用self.preferredContentSize属性来决定popover的尺寸。
//
// TableViewController.m
// iPad初步
//
// Created by 11 on 8/4/15.
// Copyright (c) 2015 soulghost. All rights reserved.
// #import "TableViewController.h" @interface TableViewController () @property (nonatomic, strong) NSMutableArray *menuList; @end @implementation TableViewController - (void)viewDidLoad {
[super viewDidLoad]; self.title = @"菜单"; CGFloat width = self.menuList.count * 44;
// 过期的方法self.contentSizeForViewInPopover需要计算导航控制器的标题宽度44,在iOS8不可用。
self.preferredContentSize = CGSizeMake(self.view.bounds.size.width * 0.5, width); } - (NSMutableArray *)menuList{ if (_menuList == nil) {
_menuList = [NSMutableArray arrayWithObjects:@"文件",@"编辑",@"设置",@"返回",nil];
} return _menuList; } #pragma mark - Table view data source
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
return self.menuList.count;
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *ID = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
} // 在这里设置cell数据
cell.textLabel.text = self.menuList[indexPath.row]; return cell; } @end
创建popoverView后,在iOS7如果不主动对其进行强引用会使得popoverView在显示时被释放,因此需要指定一个成员属性防止其释放;在iOS8和以后,即使不强引用也可以,但是为了适配,应该指定这个成员属性。
下面的代码演示了一个popoverView的创建:
- (IBAction)menuClick:(id)sender {
// 创建Popover的显示内容(View)。
TableViewController *tvc = [[TableViewController alloc] init];
UINavigationController *nvc = [[UINavigationController alloc] initWithRootViewController:tvc];
// 创建Popover,确定内容,确定尺寸,指定显示位置。
UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:nvc];
_popoverVc = popover;
_popoverVc.delegate = self;
// popover的尺寸由其内的视图控制器决定。
// 设置穿透蒙板的Views
_popoverVc.passthroughViews = @[_segmentBtn];
// 要指向谁,rect传入谁的bounds
// inView是Rect的参考系
[popover presentPopoverFromRect:_menuBtn.bounds inView:_menuBtn permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
注意其中的passthroughViews数组是指的能够穿过popoverView蒙板的views,因为popoverView显示时会有一个遮盖阻止用户与其他控件交互,在这个数组中的views可以穿过蒙板进行交互。
present方法传入的inView是popoverView位置的参考系,rect是显示的位置,一般有两种传递方法:①rect传入bounds而参考系为当前控件,②rect传入frame而参考系为父控件。
popoverView还有代理方法,用于阻止其dismiss或者监听销毁。
- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController{
return YES;// 返回NO不能销毁
}
// 只有系统自己销毁才会调用,主动dismiss不会调用。
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController{
NSLog(@"已经销毁");
}
第一个代理方法返回NO时不能销毁,利用这个方法可以做一些判断来决定能否销毁。
第二个代理方法在系统销毁popoverView时调用,如果自己dismiss是不会调用的。
(一〇六)iPad开发之UIPopoverController的使用的更多相关文章
- iOS iPad开发之UIPopoverController的使用
1. 什么是UIPopoverController? 是iPad开发中常见的一种控制器(在iphone上不允许使用) 跟其他控制器不一样的是,它直接继承自NSObject,并非继承自UIViewCon ...
- (一〇七)iPad开发之modal的切换方式与展示方式
在iPad上modal有四种切换方式,分别是竖直进入(由下到上,默认方式).水平翻转.淡入淡出. 属性要设置在将要modal出来的控制器上: /* typedef NS_ENUM(NSInteger, ...
- iOS开发之UIPopoverController
1.概述 是iPad开发中常见的一种控制器(在iPhone上不允许使用),跟其他控制器不一样的是,它直接继承自NSObject,并非继承自UIViewController,它只占用部分屏幕空间来呈现信 ...
- 移动前端开发之viewport,devicePixelRatio的深入理解
移动前端开发之viewport的深入理解 在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的viewport了,只有明白了viewport的概念以及弄清楚了跟viewport有关的met ...
- DarkStone - 跨平台移动应用开发之 Flex 的崛起
我的好友Ds 发布一个flex的消息.我帮忙转发 DarkStone - 跨平台移动应用开发之 Flex 的崛起 (2013-08-20 22:28:32) 此文章由 周戈 (DarkSton ...
- ArcGIS Engine开发之旅04---ARCGIS接口详细说明
原文:ArcGIS Engine开发之旅04---ARCGIS接口详细说明 ArcGIS接口详细说明... 1 1. IField接口(esriGeoDatabase)... 2 2. ...
- iOS-iPad开发之popoverController使用介绍
iOS-iPad开发之popoverController使用介绍 iOS开发UI篇-popoverController使用注意 iOS SDK:自定义Popover(弹出窗口) 实现的简单例子: // ...
- iOS多线程开发之GCD(中篇)
前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...
- Liferay7 BPM门户开发之10: 通用流程实现从Servlet到Portlet(Part1)
开发目的: 实现通用流程自动化处理(即实现不需要hardcode代码的bpm统一处理后台,仅需要写少量前端html form代码和拖拽设计BPM定义) 既可独立运行或可依托于Liferay或依托其它门 ...
随机推荐
- 习题 7-2 uva225(回溯)
题意:从(0.0)点出发,第一次走一步……第k次走k步,且每次必须转90度,不能走重复的点.求k次后回到出发点的所有情况.按最小字典序从小到大输出. 思路: 把所有坐标+220,保证其是正数,然后搜索 ...
- [SHOI2001]化工厂装箱员
题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须 ...
- PHP中利用DOM和simplxml读取xml文档
实例 用DOM获取下列xml文档中所有金庸小说的书名,该xml文档所在位置为 ./books.xml: <?xml version="1.0" encoding=" ...
- POJ-2299 Ultra-QuickSort---树状数组求逆序对+离散化
题目链接: https://vjudge.net/problem/POJ-2299 题目大意: 本题要求对于给定的无序数组,求出经过最少多少次相邻元素的交换之后,可以使数组从小到大有序. 两个数(a, ...
- C#之Action和Func的用法
以前我都是通过定义一个delegate来写委托的,但是最近看一些外国人写的源码都是用action和func方式来写,当时感觉对这很陌生所以看起源码也觉得陌生,所以我就花费时间来学习下这两种方式,然后发 ...
- node上传文件并在网页中展示
一.需求 1.当用户请求http://domain/start时,可以看到一个欢迎页面,页面上有一个文件上传的表单. 2.用户可以选择一个图片并提交表单,随后文件将被上传到http://domain/ ...
- MYSQL 表左连接 ON AND 和ON WHERE 的区别
首先是针对左右连接,这里与inner join区分 在使用left join时,on and 和on where会有区别 1. on的条件是在连接生成临时表时使用的条件,以左表为基准 ,不管on中的条 ...
- Go 语言条件语句
条件语句需要开发者通过指定一个或多个条件,并通过测试条件是否为 true 来决定是否执行指定语句,并在条件为 false 的情况在执行另外的语句. 下图展示了程序语言中条件语句的结构: Go 语言提供 ...
- PHP MySQL Order By 关键词
ORDER BY 关键词用于对记录集中的数据进行排序. ORDER BY 关键词 ORDER BY 关键词用于对记录集中的数据进行排序. ORDER BY 关键词默认对记录进行升序排序. 如果你想降序 ...
- 设计模式一日一练:中介者模式(Mediator)
Mediator模式,用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 比较典型的例子是联合国.QQ群等.比如,如果中国有 ...