我将 UIControl 子类化以组成一个包含不同标准控件的自定义控件。
对于本次讨论,我们假设我的自定义 UIControl 仅包含一个 UIButton。
我想要实现的是单击自定义 UIControl 中的任意位置会为该自定义 UIControl 生成单击事件。标准行为是 UIButton 将处理和消费(即不转发)点击事件。
由于不鼓励子类化 UIButton ,我真的找不到实现这一目标的直接方法。
有什么建议么?
我想出了一个不需要 UIButton 子类化的简单解决方案。
在为 UIButton 的 TouchUpInside 控件事件定义的操作方法中,我添加了以下代码行:
[self sendActionsForControlEvents:UIControlEventTouchUpInside];
当单击自定义 UIControl 中的任意位置时,这会导致调用 TouchUpInside 控件事件。
UIView
s 有一个称为-hitTest:withEvent:
事件系统的方法,用于抓取视图层次结构并将事件分派到子视图。如果您希望父视图吞噬所有可能被分派到其子视图的事件,只需-hitTest:withEvent:
使用以下内容覆盖父视图:
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
if(CGRectContainsPoint([self bounds], point)){
return self;
}
return [super hitTest:point withEvent:event];
}
UIButton 旨在处理触摸事件。您可以设置userInteractionEnabled
为 NO 以使按钮不接受任何触摸,或者您可以使用addTarget:action:forControlEvents:
按钮使其在触摸按钮时调用您的类上的方法。
顺便说一句,不鼓励子类化 UIButton ?
我经常在 中找到有用的用户交互相关任务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:
UIButton
UIButton