我在pickerView上方做了一个按钮以解除它。 我想我做到了 这里是启动pickerView的代码以及它的dismiss按钮。
UIPickerView *tempPickerView = [[[UIPickerView alloc] initWithFrame:
CGRectMake(kPickerViewX, kPickerViewY, kPickerViewWidth, kPickerViewHeight)] autorelease];
tempPickerView.showsSelectionIndicator = YES;
tempPickerView.delegate = self;
tempPickerView.dataSource = self;
UIButton *pickerButton = [[UIButton alloc] initWithFrame:CGRectMake(0, -32, 52, 32)];
[pickerButton setBackgroundImage:[UIImage imageNamed:@"week.png"]
forState:UIControlStateNormal];
[pickerButton addTarget:self action:@selector(hidePicker)
forControlEvents:UIControlEventTouchUpInside];
[tempPickerView addSubview:pickerButton];
[tempPickerView bringSubviewToFront:pickerButton];
[pickerButton release];
[self.view addSubview:tempPickerView];
return tempPickerView;
它看起来像这样:
该按钮位于pickerView的左上角,忘记了“周”,它只是一个临时名称。
问题是,我无法触摸此按钮,每当我试图触摸它时,我只是直接触摸它背后的东西,例如talbeViewCell。
是因为我在pickerView的框架外添加了按钮吗?
我的意思是按钮原点的坐标是(0,-32),
这样它会显示在pickerView上方,坐标有问题吗?
有谁能说出如何解决这个问题?
非常感谢!!!
答案 0 :(得分:5)
问题是您已将按钮放在其父视图的边界之外。 iOS现在这样做(简化,不是100%正确,但你得到了交易):
hitTest:withEvent:
对象上调用UIWindow
方法。hitTest:withEvent:
,如有必要,每个孩子都会打电话给hitTest:withEvent:
。hitTest:withEvent:
时,它首先查看坐标是否在其自己的边界内(IIRC)。如果不是,则返回nil
。否则它会在其子项上调用hitTest:withEvent:
。 hitTest:withEvent:
documentation明确说:
位于接收者界限之外的点永远不会被报告为命中,即使它们实际上位于接收者的一个子视图中。
现在的问题是您的按钮位于其父视图之外。因此hitTest:withEvent:
确定触摸坐标不在选择器视图的范围内,并且从不烦恼询问其子(按钮)是否可能被击中。
你可以对选择器进行子类化并覆盖hitTest:withEvent:
方法来“修复”这个,但真正的解决方法是移动按钮,使其成为选择器的兄弟,而不是孩子。
答案 1 :(得分:1)
我认为这可能是由UIPickerView
的点击测试方法引起的。如果触摸超出其范围,它可能会从NO
返回pointInside:withEvent:
。头文件(UIView.h)评论说
如果point在bounds中,默认返回YES
由于您将按钮置于UIPickerView
范围之外,这可能就是原因。
作为一种变通方法,您可以将按钮插入到选择器的超级视图中。