Позволяя пользователю выбрать строку UIPickerView, нажав

Я пытаюсь использовать UIPicker View с поведением, каким-то иным образом, чем обычно видно в примерах кода iPhone.

Что я хочу сделать, так это разрешить пользователям прокручивать содержимое подборщика, но не автоматически выбирать строку выбора (используя метод "didSelectRow" из делегата сборщика). Вместо этого я хочу, чтобы пользователь коснулся центральной строки сборщика, который подсвечивается и становится выделенным.

Есть ли способ достичь этого?

Спасибо заранее.

Ответ 1

Добавьте распознаватель жестов в UIPickerView, который запускает целевой метод в вашем объекте:

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

// target method

-(void)pickerTapped:(id)sender
{
// your code
}

Ответ 2

  • создать новый UIControl

    • то же положение, что и UIPickerView
    • [yourcontrol setBackGroundColor: [UIColor clearColor]];
  • сделать метод

- (IBAction) pickerControlTapped 
{
    [yourpicker selectRow: rand()% yourpickersize
              inComponent: 0
                 animated: YES];
}

0,3. установить связь между 1 и 2

 
[yourcontrol addTarget: self 
                action: @selector(pickerControlTapped) 
      forControlEvents: UIControlEventTouchUpInsied];

Ответ 3

Основываясь на ответе Мартина Линклетера на поддержку нажатия на сборщиках других строк: Имеет некоторые магические числа, но работает для меня.

- (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
        }
    }
}

Ответ 4

У меня есть относительно простое решение этой проблемы, которая хорошо сработала для меня. Используя скрытую настраиваемую кнопку, вы можете достичь функциональности отвода без распознавателя жестов. Это решение работает для сборщика с одним компонентом, однако я уверен, что он может быть адаптирован для работы с более.

Сначала добавьте кнопку, либо в построитель интерфейсов, либо программно. Сделайте его скрытым и широким, как сборщик, затем поместите его так, чтобы он находился точно в центре сборщика, а также перед ним в иерархии представлений.

Я использую IBAction, чтобы показать мой сборщик. Однако это действительно зависит от вас, как вы показываете и скрываете сборщика.

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

Все действия для выбора значения picker происходят в IBAction для события UIControlEventTouchUpInside, что-то вроде этого.

- (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;
    }
}

Я немного изменил код для этого ответа из рабочего кода, поэтому извиняюсь, если он вообще сломался.

Ответ 5

Для UIPickerView есть только 2 делегата.

Таким образом, мы можем использовать только 7 методов для управления UIPickerView делегатом.

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

that'all.

В случай UITableViewDelegate, есть больше методов для UITableView для управления выборами. такие как, - tableView: willSelectRowAtIndexPath:
- tableView: didSelectRowAtIndexPath:
- tableView: willDeselectRowAtIndexPath:
- tableView: didDeselectRowAtIndexPath:

Однако...

В случае UIPickerViewDelegate существует только один способ ответа на выбор строки.

- pickerView: didSelectRow: inComponent: