我正在将UIControl子类化以构成包含不同标准控件的自定义控件。
对于这个讨论,我们假设我的自定义UIControl只包含一个UIButton。
我想要实现的是,单击自定义UIControl中的任何位置会为该自定义UIControl生成单击事件。标准行为是UIButton将处理和使用(即不转发)click事件。
由于不鼓励对UIButton进行子类化,我无法找到实现此目的的简单方法。
有什么建议吗?
答案 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];
}