UIPopoverBackgroundView

UIPopoverBackgroundView

苹果缺少有关如何使用iOS5中引入的UIPopoverBackgroundView类的文档。有人举个例子吗?

我试图对其进行子类化,但是我在Lion上的XCode 4.2缺少UIPopoverBackgroundView.h
编辑:毫不奇怪,它应该已经作为#import <UIKit/UIPopoverBackgroundView.h>导入了

最佳答案

要添加其他仅链接的答案,请按以下步骤进行。

  • 创建UIPopoverBackgroundView的新子类
  • 在界面中声明以下内容:
    +(UIEdgeInsets)contentViewInsets;
    +(CGFloat)arrowHeight;
    +(CGFloat)arrowBase;
    
    @property(nonatomic,readwrite) CGFloat arrowOffset;
    @property(nonatomic,readwrite) UIPopoverArrowDirection arrowDirection;
    
  • 类方法很简单:contentViewInsets返回边框的整个宽度(不包括箭头),arrowHeight是箭头的高度,arrowBase是箭头的底部。
  • 实现两个属性 setter ,以确保调用[self setNeedsLayout]
  • 在初始化方法中,创建两个 ImageView ,一个包含您的箭头(应该是类方法中箭头尺寸的大小),另一个包含您的背景图像(必须是可调整大小的图像),然后将它们添加为 subview 。此时,将 subview 放在什么位置都没有关系,因为您没有箭头方向或偏移量。您应确保箭头 ImageView 位于背景 ImageView 上方,以便其正确融合。
  • 实现layoutSubviews。在这里,根据arrowDirectionarrowOffset属性,您必须调整背景 View 和箭头 View 的框架。
  • 背景 View 的框架应为self.bounds,由arrowHeight
  • 上箭头处的任意边上插入
  • 箭头 View 的框架应对齐,以使中心距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];
    
        }
    }
    

    关于ios - 使用UIPopoverBackgroundView类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8205846/

    10-12 13:47