【问题标题】:Activity Indicator above Button prevents Click Recognition按钮上方的活动指示器可防止点击识别
【发布时间】:2011-11-14 16:00:43
【问题描述】:

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

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

我必须将 GestureRecognition 添加到 ai 还是有更聪明的方法来点击“ai”。

亲切的问候。 $h@rky

【问题讨论】:

    标签: xcode button onclick uigesturerecognizer uiactivityindicatorview


    【解决方案1】:

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

    顺便说一句,具有被另一个视图覆盖的交互元素通常是糟糕的 UI 设计,特别是用于指示某事“忙碌”的交互元素,但在您的可点击缩略图示例中,它似乎有道理。

    【讨论】:

    • 致我的 UIDesign。我有一组带有缩略图的按钮,这些按钮是从互联网上加载的。在此过程中,ai 正在制作动画,但您应该能够按下按钮以查看全屏图像。按钮页面只是一个预览。这是一个标准的 UIActivityIndi​​catorView,我也很惊讶它被启用了。似乎是默认的。现在它工作得很好。谢谢。
    • 那确实有道理。我会修改我的答案!
    【解决方案2】:

    你需要重写 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;
    }
    

    这样,您的按钮将获得触摸事件(如果它们在其框架内),无论上面是否有东西。您无需执行任何其他操作。

    【讨论】:

    • 我几乎在每个类中都实现了这个方法,但它从未在任何地方调用过。我是否需要做一些额外的工作?
    • 你应该只在父视图中实现它,检查它是否被调用并确定触摸是否在按钮上。
    • 让我继续。我的按钮是“self.view”(UIView)的子视图。所以“self.view”是父视图(=superview)。所以我必须继承 UIView 来覆盖该方法并将这个“customView”用作我的 self.view?
    • 你可以这样做或者只是添加视图子类来处理触摸作为 viewcontroller.view 的子视图
    • 我不明白你的“公正”陈述。你能再解释一下吗,也许也可以举个例子吗?
    【解决方案3】:

    使用以下内容:

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

    @interface MyActivityIndicator: UIActivityIndicator
    @end
    
    @implementation MyActivityIndicator
    
    - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
        return NO;
    }
    
    @end
    

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

    【讨论】:

    • 我认为这也可以,但“jrturton”的答案要容易得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 2020-10-22
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    相关资源
    最近更新 更多