7

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

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

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

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

有什么建议么?

4

4 回答 4

13

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

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

[self sendActionsForControlEvents:UIControlEventTouchUpInside];

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

于 2011-03-06T03:48:15.553 回答
1

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];
}
于 2015-10-19T20:40:00.460 回答
0

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

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

于 2011-03-05T15:04:25.553 回答
0

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

于 2011-03-05T16:08:20.457 回答