在您的EDIT部分之后:
https://github.com/soxjke/TransparentControl
1)如果我将背景颜色设置为+[UIColor clearColor]
,触摸效果很好。因此,您无需进行更多操作,可以继续使用透明颜色。(顶部按钮)
2)如果我将alpha设置为0,则无法处理触摸。OK(中间按钮)
3)要处理这些触摸,有一个简单的解决方案(底部按钮),即子类化UIButton
(实际上,您可以使用层次结构中的任何内容,直到UIView
)。覆盖hitTest:withEvent:
方法。
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
return CGRectContainsPoint(self.bounds, point) ? self : nil;
}
利润
4) 如果您需要深入了解,请使用
touchesBegan:withEvent:
touchesMoved:withEvent:
touchesEnded:withEvent:
touchesCancelled:withEvent:
在您的UIResponder
子类上执行操作,就像Rob Glassey在他的答案中所提出的那样。
P.S. 最后离题一下。我不知道您实际的任务是什么,但是告诉您不能使用手势识别器,因为您需要对所有触摸事件进行“更多控制”,这说明您不了解手势识别器的可能性。因此,根据我的经验,我可以说您正在发明自行车而不是提供好的解决方案。
P.P.S 如果我和其他人提出的方法对您无效-请检查您的控件的userInteractionEnabled
附录(视图控制器代码以测试:)
#import "ViewController.h"
#import "TransparentControl.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIButton *buttonClearColor;
@property (weak, nonatomic) IBOutlet UIButton *buttonAlpha0;
@property (weak, nonatomic) IBOutlet TransparentControl *customButtonAlpha0;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self.buttonClearColor addTarget:self action:@selector(touchUpInside:) forControlEvents:UIControlEventTouchUpInside];
[self.buttonClearColor addTarget:self action:@selector(touchUpOutside:) forControlEvents:UIControlEventTouchUpOutside];
[self.buttonClearColor addTarget:self action:@selector(touchDown:) forControlEvents:UIControlEventTouchDown];
[self.buttonAlpha0 addTarget:self action:@selector(touchUpInside:) forControlEvents:UIControlEventTouchUpInside];
[self.buttonAlpha0 addTarget:self action:@selector(touchUpOutside:) forControlEvents:UIControlEventTouchUpOutside];
[self.buttonAlpha0 addTarget:self action:@selector(touchDown:) forControlEvents:UIControlEventTouchDown];
[self.customButtonAlpha0 addTarget:self action:@selector(touchUpInside:) forControlEvents:UIControlEventTouchUpInside];
[self.customButtonAlpha0 addTarget:self action:@selector(touchUpOutside:) forControlEvents:UIControlEventTouchUpOutside];
[self.customButtonAlpha0 addTarget:self action:@selector(touchDown:) forControlEvents:UIControlEventTouchDown];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
- (void)touchUpInside:(id)sender
{
NSLog(@"%s", __PRETTY_FUNCTION__);
}
- (void)touchDown:(id)sender
{
NSLog(@"%s", __PRETTY_FUNCTION__);
}
- (void)touchUpOutside:(id)sender
{
NSLog(@"%s", __PRETTY_FUNCTION__);
}
@end
UIControl
在视图层次结构中处于正确的位置吗?检查一下你的视图层次结构的顺序。 - MichaelUIControl
并将其完全设置为透明,然后尝试使用addTarget
注册一些触摸事件。它将不起作用。设计真是太愚蠢了... - RastoUIControl
,但是我注意到了同样的问题。我还按照这个 SO帖子尝试了hitTest:Point:withEvent
,但它也不能正常工作。也许您可以将背景颜色设置为白色,并设置非常低的alpha值?或者甚至尝试使用UIButton
? - Michael- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
,您可以精确地指定手势将传递到哪个识别器。难道您不能仅指定控件的视图接收触摸吗?(如果触摸位于其中一个子控制器上,则拒绝触摸。) - Tim Quinn