苹果缺少关于如何使用iOS5中引入的UIPopoverBackgroundView
类的文档。有人能举个例子吗?
我已经尝试子类化它,但我的XCode 4.2上的狮子是缺少UIPopoverBackgroundView.h
Edit:
不出所料,它应该被导入为#import <UIKit/UIPopoverBackgroundView.h>
要添加其他仅链接的答案,可以这样做。
- 创建一个新的UIPopoverBackgroundView子类
-
在你的接口中声明以下内容:
+(UIEdgeInsets)contentViewInsets; +(CGFloat)arrowHeight; +(CGFloat)arrowBase; @property(nonatomic,readwrite) CGFloat arrowOffset; @property(nonatomic,readwrite) UIPopoverArrowDirection arrowDirection;
-
类方法是直接的:
contentViewInsets
返回你的边界的宽度所有的方式(不包括箭头),arrowHeight
是你的箭头的高度,arrowBase
是你的箭头的基础。 - 实现两个属性设置,确保调用
[self setNeedsLayout]
。 - 在你的初始化方法中,创建两个图像视图,一个持有你的箭头(应该是你类方法中箭头尺寸的大小),一个持有你的背景图像(必须是一个可调整大小的图像),并将它们添加为子视图。此时将子视图放在哪里并不重要,因为没有箭头方向或偏移量。你应该确保箭头图像视图在背景图像视图之上,这样它就能正确地融合在一起。
- 实现
layoutSubviews
。在这里,根据arrowDirection
和arrowOffset
属性,你必须调整背景视图和箭头视图的框架。- 你的背景视图的框架应该是
self.bounds
,插入arrowHeight
在任何边缘的箭头 - 箭头视图的框架应该对齐,使
arrowOffset
的中心远离self
的中心(根据轴正确)。你必须改变图像的方向,如果箭头方向不是向上的,但我的弹出窗口只会向上所以我没有这样做。
- 你的背景视图的框架应该是
下面是我的Up-only子类的layoutSubviews
方法:
-(void)layoutSubviews
{
if (self.arrowDirection == UIPopoverArrowDirectionUp)
{
CGFloat height = [[self class] arrowHeight];
CGFloat base = [[self class] arrowBase];
self.background.frame = CGRectMake(0, height, self.frame.size.width, self.frame.size.height - height);
self.arrow.frame = CGRectMake(self.frame.size.width * 0.5 + self.arrowOffset - base * 0.5, 1.0, base, height);
[self bringSubviewToFront:self.arrow];
}
}
另一个链接只回答,但自定义UIPopoverBackgroundView
比你可能意识到的有限的文档和这个github项目有一个完整的工作示例,节省了我很多时间:https://github.com/GiK/GIKPopoverBackgroundView
将它放到您自己的项目中是相当简单的。最棘手的部分是为你使用的任何自定义图像调整帽插入。我建议您在项目中进行原位定制,因为在将其迁移到您自己的项目之前,很容易验证所有弹出窗口方向/方向用例在模拟器中正确显示。