按钮上方的活动指示器可防止单击识别

时间:2011-11-14 16:00:43

标签: xcode button onclick uigesturerecognizer uiactivityindicatorview

我有一个UIButton“ bn ”和一个UIActivityIndi​​cator“ ai ”位于按钮(ai.center = bn.center)上方。

只要 ai 可见且动画效果,我就无法按下 ai的框架下方的按钮,但超出了我的范围。

我是否必须将GestureRecognition添加到 ai ,或者是否有更智能的方式点击“ ai ”。

亲切的问候。 $ H @ RKY

3 个答案:

答案 0 :(得分:2)

您可以简单地设置ai.userInteractionEnabled = NO;吗?无论如何,我很惊讶它在一个活动指示器上启用 - 这是一个标准组件还是你做了一个子类?

顺便说一句,通常是糟糕的UI设计,有一个由另一个视图覆盖的交互元素,特别是用于表示某些东西“忙”的视图,但在你的可点击缩略图的例子中,它似乎有道理。

答案 1 :(得分:0)

您需要覆盖UIView方法

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
在父视图中

。如果点击在按钮内,则返回按钮,否则返回nil。这是关于这种方法的讨论的一部分:

  

此方法通过发送遍历视图层次结构   pointInside:withEvent:消息到每个子视图以确定哪个   子视图应该会收到触摸事件。如果pointInside:withEvent:   返回YES,然后遍历子视图的层次结构;否则,它   视图层次结构的分支被忽略。你很少需要打电话   方法你自己,但你可以覆盖它来隐藏触摸事件   子视图

编辑:

假设您有一个包含bn和ai的UIView子类,您可以实现这样的方法

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if (CGRectContainsPoint(bn.frame, point)) {
        return bn;
    }
    return nil;
}

这样你的按钮就能获得触摸事件(如果它们在它的框架内),无论它是否在它之上。你不需要做任何其他事情。

答案 2 :(得分:0)

使用以下内容:

首先,使用以下方法覆盖为UIActivityIndi​​cator创建子类:

@interface MyActivityIndicator: UIActivityIndicator
@end

@implementation MyActivityIndicator

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    return NO;
}

@end

之后,在项目的任何地方使用MyActivityIndi​​cator而不是UIActivityIndi​​cator(在NIB文件或代码中,取决于你在哪里创建它)