这对我来说有些费解。在我建立的一个应用程序中,我使用了一个UITextField,并将一个按钮添加为其leftView属性。然而,在iPad上(无论是模拟器还是实际设备),按钮会接收到超出其边界范围外的触摸事件。这会干扰UITextField成为第一响应者的能力,当用户触摸占位符文本时。似乎触摸占位符文本时,事件被按钮处理而不是文本字段本身。奇怪的是,这只出现在iPad上;在iPhone上,它按预期工作。
下面是一些简单的代码,演示了这个问题:
下面是一些简单的代码,演示了这个问题:
- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(10.0f,
10.0f,
(self.view.frame.size.width - 20.0f),
35.0f)];
textField.borderStyle = UITextBorderStyleRoundedRect;
textField.placeholder = @"Test text";
[self.view addSubview:textField];
UIButton *addButton = [UIButton buttonWithType:UIButtonTypeContactAdd];
[addButton addTarget:self action:@selector(touchDown:) forControlEvents:UIControlEventTouchDown];
[addButton addTarget:self action:@selector(touchUpInside) forControlEvents:UIControlEventTouchUpInside];
[addButton addTarget:self action:@selector(touchUpOutside) forControlEvents:UIControlEventTouchUpOutside];
textField.leftView = addButton;
textField.leftViewMode = UITextFieldViewModeAlways;
}
- (void)touchDown:(id)sender {
NSLog(@"touchDown");
}
- (void)touchUpInside {
NSLog(@"touchUpInside");
}
- (void)touchUpOutside {
NSLog(@"touchUpOutside");
}
看起来有时候触摸似乎仍然被视为在按钮范围内,即使它们表现为在按钮范围外。随后向右移动,该按钮仅接收UIControlEventTouchDown和UIControlEventTouchUpOutside事件。
2013-07-25 11:51:44.217 TestApp[22722:c07] touchDown
2013-07-25 11:51:44.306 TestApp[22722:c07] touchUpInside
2013-07-25 11:51:44.689 TestApp[22722:c07] touchDown
2013-07-25 11:51:44.801 TestApp[22722:c07] touchUpOutside
编辑 这里是一个例子,展示了按钮的背景颜色更改以及触发上述事件的大致区域。我检查了按钮的框架,它的宽度小于30px。