Разрешение пользователю выбирать строку UIPickerView, нажав - PullRequest
11 голосов
/ 08 марта 2010

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

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

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

Заранее спасибо.

Ответы [ 5 ]

15 голосов
/ 28 октября 2011

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

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

// target method

-(void)pickerTapped:(id)sender
{
// your code
}
5 голосов
/ 10 марта 2010
  1. сделать новый UIControl

    • та же позиция, что и в UIPickerView
    • [yourcontrol setBackGroundColor: [UIColor clearColor]];
  2. сделать метод

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

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

 
[yourcontrol addTarget: self 
                action: @selector(pickerControlTapped) 
      forControlEvents: UIControlEventTouchUpInsied];
2 голосов
/ 03 августа 2012

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

- (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
        }
    }
}
1 голос
/ 07 декабря 2012

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

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

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

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

Все действие по выбору значения средства выбора происходит в 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;
    }
}

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

0 голосов
/ 09 марта 2010

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

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

- pickerView: rowHeightForComponent:
- pickerView: widthForComponent:
- pickerView: titleForRow: forComponent:
- pickerView: viewForRow: forComponent: повторное использование View:
- pickerView: didSelectRow: inComponent:
- numberOfComponentsInPickerView:
- pickerView: numberOfRowsInComponent:

that'all.

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

Однако ...

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

- pickerView: didSelectRow: inComponent:

...