iOS8新特性:UIPopoverPresentationController

在IOS 8 之后,iPhone终于可以像iPad一样弹出一个小窗口拉.这是个特大喜讯.你可以直接使用系统框架而不需要使用其他第三方框架.可以避免一些不必要的麻烦.

简单配置

//Present the view controller using the popover style.
  myPopoverViewController.modalPresentationStyle = UIModalPresentationPopover;
  [self presentViewController:myPopoverViewController animated: YES completion: nil];

// Get the popover presentation controller and configure it.
  UIPopoverPresentationController *presentationController =
  [myPopoverViewController popoverPresentationController];
  presentationController.permittedArrowDirections = UIPopoverArrowDirectionLeft | UIPopoverArrowDirectionRight;
  presentationController.sourceView = myView;
  presentationController.sourceRect = sourceRect;

以presentViewController的方式集成在模态视图控制器中,并能够对其统一管理.与之前UIPopoverViewController不同的是,UIPopoverPresentationController不需要新建它的实例,它的实例变量值需要在你的view controller设置模态样式:modalPresentationStyle = UIModalPresentationPopover之后,通过viewcontroller的 popoverPresentationController获取即可.然后你只需要对popoverPresentationController的样式属性进行设置即可.
效果图:


弹出视图控制器演示
弹出视图控制器演示

属性

popverLayoutMargins
一个edge值,能推测与屏幕在旋转之后的弹出窗口的相对位置.目前在iOS 9 上测试无效果.

backgroundColor
背景颜色.在没有自定义背景视图的情况下.设置background值只能在popover view 内部改变颜色.

barButtonItem
将当前锚点设置为barButtonItem所在的位置.在弹出窗口时,系统会自动在barButtonItem的位置弹出.如果需要修改弹出视图和位置,可以使用sourceViewsourceRect来替代这个属性
注:巨坑 barButtonItem在设置之后,sourceViewsourceRect将会失效

sourceView
箭头所指的对应的视图,sourceRect会以这个视图的左上角为原点.使用这个属性和sourceRect计算箭头所处的锚点.如果不设置,sourceRect就会不起作用

sourceRect
箭头所指对应的区域.锚点的计算是这样的.首先根据sourceView.在sourceView描绘出一块区域(CGRect),然后箭头指向这块区域的中心点.

delegate 代理
可以控制窗口谈出和消失的行为
注意: 在默认的情况下,UIPopoverPresentationController会根据是否是iphone和ipad来选择弹出的样式,如果当前的设备是iphone,那么系统会选择modal样式,并弹出到全屏.如果我们需要改变这个默认的行为,则需要实现代理,在代理- adaptivePresentationStyleForPresentationController:这个方法中返回一个UIModalPresentationNone样式

-(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller
{
    return UIModalPresentationNone;
}

permittedArrowDirections
允许弹出窗口时的箭头方向,设置barButtonItem这个属性无效

arrowDirection readonly
当前的箭头方向在弹出之前.消失之后,这个值为 UIPopoverArrowDirectionUnknown

popoverBackgroundViewClass
自定义的的背景类.用于替换弹出视图之后的背景.这个类必须继承UIPopoverBackgroundView,且必须实现UIPopoverBackgroundViewMethods接口的方法.

UIPopoverBackgroundView
这个类必须继承和子类化才能使用.你必须实现箭头和调整border的风格.popover controller 将会放置在这个自定义的backgroung的左上方.
这个背景内容应该基于一个可伸缩的图片. Apple官方文档解释

Because the popover is animated into place (and may require animated transitions), using images is the only way to ensure that the animations are smooth and not jittery.

大致意思为:因为弹窗执行动画效果弹到特定的地方,要确保动画平滑且没卡顿,就只有一个方法,那就是使用可伸缩的图.

需要重载的属性和方法,同时实现setter 和getter方法

property

arrowOffset
arrowDirection

method

+ (CGFloat)arrowBase
+ (UIEdgeInsets)contentViewInsets
+ (CGFloat)arrowHeight

然后你需要自定背景图,先看看上面的属性和方法代表的意义.

各个属性的意义

详细的自定义背景,国外有一片文章写得不错.
Customizing UIPopover with UIPopoverBackgroundView


引用:
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIPopoverBackgroundView_class/index.html#//apple_ref/occ/cl/UIPopoverBackgroundView

http://www.scianski.com/customizing-uipopover-with-uipopoverbackgroundview/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容