Using UIPopoverBackgroundView class



苹果缺少关于如何使用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。在这里,根据arrowDirectionarrowOffset属性,你必须调整背景视图和箭头视图的框架。
    • 你的背景视图的框架应该是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

将它放到您自己的项目中是相当简单的。最棘手的部分是为你使用的任何自定义图像调整帽插入。我建议您在项目中进行原位定制,因为在将其迁移到您自己的项目之前,很容易验证所有弹出窗口方向/方向用例在模拟器中正确显示。

最新更新