2012-01-17 5 views
1

私はそれを却下するためにピッカーの上にボタンを作った。 と私はそれを作ったと思う、 ここに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; 

、それは次のようになります。ボタンはpickerViewの左上cornorであり、「週」を忘れること

enter image description here

、それだけで一時的な名前です。

問題は、このボタンに触れることはできません。触ってみるたびに、talbeViewCellなどの背後にあるものに直接触れただけです。

私はピッカーのフレームの外側にボタンを追加したからですか?私はそれがpickerView上に表示されるように(0、-32)ボタンの原点の座標、

意味

、座標で何か問題はありますか?

誰でもこの問題を解決する方法を教えてもらえますか?

ありがとう、たくさん!

+0

ボタンを標準の丸い角の四角形のボタンに置​​き換えて再試行してください。 – Raptor

答えて

5

問題は、親ビューの範囲外にボタンを配置したことです。これでiOSはこれを行います(100%正確ではありませんが、あなたは取引になります):

  • タッチが発生したことに気づきました。そのタッチの座標を計算します。
  • 次に、どのビューがタッチされたかを調べようとします。これを行うには、アプリのオブジェクトUIWindowhitTest:withEvent:メソッドを呼び出します。
  • それぞれの子にはhitTest:withEvent:が呼び出され、必要に応じて子どもにはそれぞれhitTest:withEvent:が呼び出されます。
  • ビューのhitTest:withEvent:が呼び出されると、まず座標がそれ自身の境界(IIRC)内にあるかどうかが調べられます。そうでない場合は、nilを返します。それ以外の場合は、その子のhitTest:withEvent:を呼び出します。明示的

hitTest:withEvent: documentation言います:レシーバの境界外にある

ポイントは、彼らが実際に受信機のサブビューの1内にある場合でも、ヒットとして報告されることはありません。

ボタンが親ビューの外にあるという問題がありました。したがって、hitTest:withEvent:は、タッチ座標がピッカービューの範囲内にないと判断し、決してその子供(ボタン)にヒットする可能性があるかどうかを尋ねることに煩わされることはありません。

ピッカーをサブクラス化してhitTest:withEvent:メソッドをオーバーライドしてこれを「修正」できますが、実際の修正では、ボタンを子ではなくピッカーの兄弟のように移動することができます。

+0

ありがとう!私は何をすべきか知っていた!私はpickerViewとその中のこのボタンと一緒にビューを作成するつもりです。 –

1

これはUIPickerViewのヒットテスト方法によって発生している可能性があります。タッチがその範囲外にある場合、をpointInside:withEvent:から返すことがあります。ヘッダファイル(UIView.h)コメントはポイントが境界

であればYESあなたも理由かもしれUIPickerViewの境界、外部のボタンを配置しているので

デフォルトのリターンを言います。

回避策として、ピッカーのスーパービューにボタンを挿入できます。

関連する問題