【问题标题】:Managing events on a custom UIControl管理自定义 UIControl 上的事件
【发布时间】:2011-07-09 09:57:30
【问题描述】:

我将 UIControl 子类化以组成一个包含不同标准控件的自定义控件。

对于本次讨论,我们假设我的自定义 UIControl 仅包含一个 UIButton。

我想要实现的是单击自定义 UIControl 中的任意位置会为该自定义 UIControl 生成单击事件。标准行为是 UIButton 将处理和消费(即不转发)点击事件。

由于不鼓励子类化 UIButton,我真的找不到直接的方法来实现这一点。

有什么建议吗?

【问题讨论】:

  • 真的不鼓励子类化UIButton吗?除了提到buttonWithType: 构造函数不会返回子类的实例之外,我在UIButton Class Reference 上没有看到任何问题。

标签: ios events uicontrol


【解决方案1】:

我想出了一个不需要子类化 UIButton 的简单解决方案。

在为 UIButton 的 TouchUpInside 控件事件定义的动作方法中,我添加了以下代码行:

[self sendActionsForControlEvents:UIControlEventTouchUpInside];

这会导致在自定义 UIControl 中单击任意位置时调用 TouchUpInside 控件事件。

【讨论】:

    【解决方案2】:

    UIViews 有一个名为-hitTest:withEvent: 的方法,事件系统使用它来抓取视图层次结构并将事件分派到子视图。如果您希望父视图吞噬所有可能被分派到其子视图的事件,只需使用以下内容覆盖父视图的 -hitTest:withEvent:

    -(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
      if(CGRectContainsPoint([self bounds], point)){
        return self;
      }
      return [super hitTest:point withEvent:event];
    }
    

    【讨论】:

      【解决方案3】:

      UIButton 旨在处理触摸事件。您可以将 userInteractionEnabled 设置为 NO 以使按钮不接受任何触摸,或者您可以在按钮上使用 addTarget:action:forControlEvents: 使其在触摸按钮时调用您的类上的方法。

      顺便说一句,在哪里不鼓励子类化 UIButton?

      【讨论】:

      • UIButton 是一个类簇,往往会使事情复杂化。请参考以下问题的第一条评论:stackoverflow.com/questions/2920045/…
      • 这意味着“不要尝试将buttonWithType: 与您的自定义子类一起使用”。
      • 我理解 userInteractionEnabled 和 addTarget:action:forControlEvents: 的目的。事实上,我在 UIButton 上使用它来处理 TouchUpInside 事件。但是,我还想做的是将 TouchUpInside 事件转发到按钮所在的自定义 UIControl。通过这种方式,我的自定义控件可以在单击时触发操作(例如隐藏键盘),无论单击是在 UIButton 上还是在 UIControl 上的其他位置。
      • 所以,如果子类化 UIButton 是一个选项,我想我可以覆盖 sendAction:to:forEvent: 方法,所以它在 UIButton 上被调用并转发到自定义 UIControl。
      • 刚刚尝试继承 UIButton 并遇到问题。使用 IB,我将自定义 UIButton 添加到自定义 UIControl 中,并给它一个圆形矩形按钮类型。但是,在运行应用程序时,它会显示一个自定义按钮。由于 buttonType 是只读的,我在 IB 中看不到解决此问题的方法。有什么建议吗?
      【解决方案4】:

      我经常在UIResponder class 中找到有用的用户交互相关任务,这是UIControl - UIButton 的超类。 在http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIResponder_Class/Reference/Reference.html 中了解– touchesBegan:withEvent:– touchesMoved:withEvent:– touchesEnded:withEvent:– touchesCancelled:withEvent: 您可以找到为您的UIButton 自定义用户交互的方法。顺便说一句,我认为子类化UIButton 不会有任何问题,无论你听到什么,只要你的实现被正确地添加到超类实现中,或者负责任地完全覆盖它。

      【讨论】:

        猜你喜欢
        • 2011-02-23
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 2010-11-23
        • 1970-01-01
        • 2018-05-28
        • 1970-01-01
        相关资源
        最近更新 更多