使用UIPopoverBackgroundView类

Appls缺less关于如何使用iOS5中引入的UIPopoverBackgroundView类的文档。 任何人都有一个例子?

我试图做它的子类,但我的Lion上的XCode 4.2缺lessUIPopoverBackgroundView.h

编辑:不出所料,它应该已被导入为#import <UIKit/UIPopoverBackgroundView.h>

要添加到其他链接的答案,这是如何做到这一点。

  • 创build一个UIPopoverBackgroundView的新子类
  • 在您的界面中声明以下内容:

     +(UIEdgeInsets)contentViewInsets; +(CGFloat)arrowHeight; +(CGFloat)arrowBase; @property(nonatomic,readwrite) CGFloat arrowOffset; @property(nonatomic,readwrite) UIPopoverArrowDirection arrowDirection; 
  • 类方法很简单: contentViewInsets返回边框的宽度(不包括箭头), arrowHeight是箭头的高度, arrowBase是箭头的基础。

  • 实现两个属性设置器, 确保调用[self setNeedsLayout]
  • 在你的初始化方法中,创build两个图像视图,一个保存你的箭头(它应该是你的类方法中的箭头尺寸的大小),另一个保存你的背景图像(必须是可resize的图像),并将它们添加为子视图。 在这一点上放置子视图的位置并不重要,因为您没有箭头方向或偏移量。 您应该确保箭头图像视图在背景图像视图之上,以便正确混合。
  • 实现layoutSubviews 。 在这里,根据arrowDirectionarrowOffset属性,您必须调整背景视图和箭头视图的框架。
    • 你的背景视图的框架应该是self.bounds ,由arrowHeight在箭头的任何边缘插入
    • 箭头视图的框架应该alignment,使得中心距arrowOffset偏离self的中心(根据轴线正确)。 如果箭头方向不对,你必须改变图像的方向,但是我的popup只会弹起来,所以我没有这样做。

以下是我的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

放入你自己的项目是相当简单的。 最棘手的部分是适应你使用的任何自定义图像的帽子插图。 我build议在项目中就地进行自定义,因为在将模拟器迁移到自己的项目之前,可以很容易地validation所有popup方向/方向用例在模拟器中正确显示。