我无法触摸的UIButton

Wan*_*ang 1 iphone events picker touch uibutton

我在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;
Run Code Online (Sandbox Code Playgroud)

它看起来像这样:

在此输入图像描述

那个按钮位于pickerView的左上角,忘记了"周",它只是一个临时名称.

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

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

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

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

任何人都可以告诉如何解决这个问题?

非常感谢和很多!!!

Dar*_*ust 5

问题是您已将按钮放在其父视图的边界之外.iOS现在这样做(简化,不是100%正确,但你得到了交易):

  • 它注意到发生了一次触摸.它计算触摸的坐标.
  • 然后它试图找出触摸了哪个视图.为此,它会hitTest:withEvent:UIWindow您应用的对象上调用该方法.
  • 这反过来要求hitTest:withEvent:每个孩子,hitTest:withEvent:如果有必要,每个孩子都会打电话给他们的孩子.
  • hitTest:withEvent:调用视图时,它首先查看坐标是否在其自己的范围内(IIRC).如果不是,则返回nil.否则就会召唤hitTest:withEvent:孩子.

hitTest:withEvent:文件 明确指出:

位于接收者界限之外的点永远不会被报告为命中,即使它们实际上位于接收者的子视图中.

现在的问题是您的按钮位于其父视图之外.因此,hitTest:withEvent:确定触摸坐标不在拾取器视图的范围内,并且永远不会问它的子(按钮)是否可能被击中.

你可以子类化选择器并重写hitTest:withEvent:方法来"修复"这个,但真正的解决方法是移动按钮使其成为选择器的兄弟,而不是孩子.