2012-01-17 117 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邊界之外的按鈕,那很可能是這個原因。

作爲一種解決方法,您可以將按鈕插入選擇器的超級視圖。