我无法触摸的UIButton

时间:2012-01-17 08:13:31

标签: iphone events uibutton touch picker

我在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;

它看起来像这样:

enter image description here

该按钮位于pickerView的左上角,忘记了“周”,它只是一个临时名称。

问题是,我无法触摸此按钮,每当我试图触摸它时,我只是直接触摸它背后的东西,例如talbeViewCell。

是因为我在pickerView的框架外添加了按钮吗?

我的意思是按钮原点的坐标是(0,-32),

这样它会显示在pickerView上方,坐标有问题吗?

有谁能说出如何解决这个问题?

非常感谢!!!

2 个答案:

答案 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范围之外,这可能就是原因。

作为一种变通方法,您可以将按钮插入到选择器的超级视图中。