0

我正在构建一个类似于 UIPopover 视图的自定义 UIView,只需将 UIView 类子类化并在其中构建控件和事件的内容.. 为了显示这个视图,我通过这样的子类数据源分配 superView

    if ([dataSource respondsToSelector:@selector(containerView)]) 
        superView = [dataSource containerView];

为了展示它,我有一个这样的功能

- (void) showPopOverFromRect : (CGRect) rect
{
    CGSize popSize = self.frame.size;

    float yPoint;

    if(ntPopOverDirection == NTPopOverArrowDirectionUP)
        yPoint = rect.origin.y + 10;
    else
        yPoint = rect.origin.y - 10;

    self.frame = CGRectMake(rect.origin.x - popSize.width, yPoint , popSize.width, popSize.height);

    [superView addSubview:self];
}

所以我的问题..如果用户像 UIPopOverController 一样点击 superView 上的 AnyWhere ,我怎么能关闭这个视图(删除它)?

4

2 回答 2

3

我建议您创建自定义 UIView 以使用清晰的背景或径向渐变填充整个超级视图或整个屏幕。然后在其中放置另一个具有弹出框外观的 UIView。

这消除了尝试捕获点击和从其他视图发送通知的问题。它将是自包含的。

您可以轻松地在自定义视图中添加手势识别器,以在用户触摸空白区域时关闭视图。

于 2012-04-30T15:16:22.420 回答
-1

您可以在新的 UIView 下方放置一个 UIButton ,这很清楚。当按下这个新按钮时,它会关闭您的视图并将自己从超级视图中移除。

就像是:

- (void) showPopOverFromRect : (CGRect) rect
{
    CGSize popSize = self.frame.size;

    float yPoint;

    if(ntPopOverDirection == NTPopOverArrowDirectionUP)
        yPoint = rect.origin.y + 10;
    else
        yPoint = rect.origin.y - 10;

    self.frame = CGRectMake(rect.origin.x - popSize.width, yPoint , popSize.width, popSize.height);

    UIButton *dismissButton = [UIButton buttonWithType:UIButtonTypeCustom];
    dismissButton.backgroundColor = [UIColor clearColor];
    dismissButton.frame = [[UIScreen mainScreen] bounds];
    [dismissButton addTarget:self.delegate action:@selector(dismissPopover) forControlEvents:UIControlEventTouchUpInside];
    [superview addSubview:dismissButton];

    [superView addSubview:self];
}

不过,您必须设置视图以将其超级视图设置为接收消息以关闭弹出框的委托。

于 2012-04-30T15:06:10.667 回答