11

iPhone のコード例で通常見られる動作とは多少異なる動作で UIPicker ビューを使用しようとしています。

私がやりたいことは、ユーザーがピッカーの内容をスクロールできるようにすることですが、ピッカーの行を自動的に選択しないようにすることです (ピッカーのデリゲートから「didSelectRow」メソッドを使用)。代わりに、ユーザーがピッカーの中央の行に触れることができるようにしたいと思います。これは強調表示され、選択されます。

これを達成する方法はありますか?

前もって感謝します。

4

5 に答える 5

15

オブジェクトのターゲット メソッドをトリガーする UIPickerView にジェスチャ レコグナイザーを追加します。

myGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(pickerTapped:)];
[myPicker addGestureRecognizer:myGR];

// target method

-(void)pickerTapped:(id)sender
{
// your code
}
于 2011-10-28T10:49:39.443 に答える
5
  1. 新しいUIControlを作る

    • UIPickerView と同じ位置
    • [yourcontrol setBackGroundColor: [UIColor clearColor]];
  2. メソッドを作る

- (IBAction) pickerControlTapped
{
    [yourpicker selectRow: rand()% yourpickersize
              インコンポーネント: 0
                 アニメーション: はい];
}

.3. 1と2をつなぐ

 
[yourcontrol addTarget: 自己
                アクション: @selector(pickerControlTapped)
      forControlEvents: UIControlEventTouchUpInsied];
于 2010-03-10T01:23:46.183 に答える
2

ピッカーの他の行のタップをサポートするためのMartinLinklaterの回答に基づいて構築:いくつかのマジックナンバーがありますが、私にとってはうまくいきます。

- (void) pickerTapped:(UITapGestureRecognizer*)gestureRecognizer
{
    CGPoint location = [gestureRecognizer locationInView:self.pickerView];

    CGFloat halfViewHeight = self.pickerView.frame.size.height / 2;

    NSInteger row = -1;
    if (location.y < halfViewHeight - 22
        && location.y > halfViewHeight - 66)
    {
        row = [self.pickerView selectedRowInComponent:0] - 1;
    }
    else if (location.y < halfViewHeight + 22
             && location.y > halfViewHeight - 22)
    {
        row = [self.pickerView selectedRowInComponent:0];
    }
    else if (location.y < halfViewHeight + 66
             && location.y > halfViewHeight + 22)
    {
        row = [self.pickerView selectedRowInComponent:0] + 1;
    }

    if (row >= 0 && row < [self.content count])
    {
        id element = [self.content objectAtIndex:row];

        if (element)
        {
            [self.pickerView selectRow:row inComponent:0 animated:YES];

            // do more stuff
        }
    }
}
于 2012-08-03T01:45:46.020 に答える
1

私は、この問題に対する比較的簡単な解決策を持っています。非表示のカスタム ボタンを使用すると、ジェスチャ認識機能なしでタップ機能を実現できます。このソリューションは、1 つのコンポーネントのピッカーで機能しますが、より多くのコンポーネントで動作するように適応できると確信しています。

最初に、Interface Builder またはプログラムでボタンを追加します。非表示にし、ピッカーと同じ幅にしてから、ピッカーの正確な中央に配置し、ビュー階層でピッカーの前にも配置します。

このような IBAction を使用して、ピッカーを表示しています。ただし、ピッカーをどのように表示および非表示にするかは、実際にはあなた次第です。

- (IBAction)showPicker:(id)sender
{
    _picker.hidden = NO;
    _buttonPicker.hidden = NO;
}

ピッカー値を選択するためのすべてのアクションは、UIControlEventTouchUpInside イベントの IBAction で発生します。たとえば、次のようになります。

- (IBAction)selectPicker:(id)sender
{
    //Hide the button so that it doesn't get in the way
    _buttonPicker.hidden = YES;

    //Make sure we're within range
    NSInteger max = _values.count;
    NSInteger row = [_picker selectedRowInComponent:0];
    if(row >= 0 && row < max) {
        NSString *value = [_values objectAtIndex:row];

        //Set the label value and hide the picker
        _label.text = value;
        _picker.hidden = YES;
    }
}

この回答のコードを作業コードから少し変更したので、壊れている場合はお詫びします。

于 2012-12-07T01:26:17.497 に答える
0

UIPickerView のデリゲートは 2 つだけです。

したがって、デリゲートによって UIPickerView を制御するために使用できるメソッドは 7 つだけです。

– pickerView:rowHeightForComponent:
– pickerView:widthForComponent:
– pickerView:titleForRow:forComponent:
– pickerView:viewForRow:forComponent:reusingView: – pickerView:didSelectRow:inComponent: – numberOfComponentsInPickerView:
– pickerView:numberOfRowsInComponent :

それだけです。

UITableViewDelegate ケースでは、選択を管理するための UITableView のメソッドがさらにあります。– tableView:willSelectRowAtIndexPath: tableView:didSelectRowAtIndexPath: – tableView:willDeselectRowAtIndexPath: – tableView:didDeselectRowAtIndexPath:


でも...

UIPickerViewDelegate の場合、行選択に応答するメソッドは 1 つだけです。

– pickerView:didSelectRow:inComponent:

于 2010-03-09T00:45:34.967 に答える