Позволяя пользователю выбрать строку 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: