2012-01-17 87 views
1

我在pickerView上方创建了一个按钮来解除它。 ,我想我是这么做的, 这里是启动pickerView的代码以及它的解除按钮。我无法触摸的UIButton

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左上角cornor,忘了“周”,它只是一个临时名称。

问题是,我无法触摸这个按钮,每当我尝试触摸它,我只是直接触摸它后面的东西,如talbeViewCell。

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

我指的是按钮的原点的坐标为(0,-32),

,以便它的pickerView上面显示,有任何问题与协调?

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

非常感谢和很多!

+0

尝试用标准圆角矩形按钮替换按钮并重试。 – Raptor 2012-01-17 08:21:37

回答

5

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

  • 它注意到触摸发生。它计算该触摸的坐标。
  • 然后尝试找出哪个视图被触摸。为此,它会调用您的应用的UIWindow对象上的hitTest:withEvent:方法。
  • 反过来,每个孩子都会拨打hitTest:withEvent:,如果需要的话,每个孩子都会拨打hitTest:withEvent:
  • 当调用视图的hitTest:withEvent:时,它首先查看坐标是否在其自己的范围内(IIRC)。如果不是,则返回nil。否则它会给子女打电话hitTest:withEvent:

hitTest:withEvent: documentation明确地说:

点摆在接收器的边界之外从不报告为命中,即使他们实际上在于接收器的子视图中的一个内。

现在的问题是您的按钮不在其父视图之外。因此,hitTest:withEvent:确定触摸坐标不在选择器视图的边界内,并且从不会询问其子(按钮)是否可能被击中。

您可以对选取器进行子类化并覆盖hitTest:withEvent:方法来“修复”这个问题,但真正的解决方法是移动按钮,使其成为选取器的同胞而不是孩子。

+0

非常感谢!我知道我该怎么做!我将使用pickerView以及其中的此按钮来制作视图,然后应该可以! – 2012-01-19 05:01:35

1

我认为这可能是由UIPickerView的命中测试方法造成的。如果触摸超出范围,它可能会从pointInside:withEvent:返回NO。头文件(UIView.h)评论说

默认返回YES,如果点在边界

既然你放置的UIPickerView边界之外的按钮,那很可能是这个原因。

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