管理自定义UIControl上的事件

时间:2011-03-05 13:34:51

标签: ios events uicontrol

我正在将UIControl子类化以构成包含不同标准控件的自定义控件。

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

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

由于不鼓励对UIButton进行子类化,我无法找到实现此目的的简单方法。

有什么建议吗?

4 个答案:

答案 0 :(得分:12)

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

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

[self sendActionsForControlEvents:UIControlEventTouchUpInside];

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

答案 1 :(得分:0)

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

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

答案 2 :(得分: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:– touchesCancelled:withEvent:您可以找到为UIButton自定义用户互动的方法。顺便说一下,只要你的实现被正确地添加到超类实现中,或者完全负责地覆盖它,我认为无论你听到什么,都不会有任何问题继承UIButton

答案 3 :(得分:0)

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

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