UIPickerView-событие срабатывает при выделении строки
Вот что я хотел бы сделать:
Показан UIPickerView. Если пользователь коснется выбранной строки, строка блокируется (это многокомпонентный выбор), а другие компоненты могут свободно вращаться. Если строка уже была заблокирована, и пользователь касается заблокированной строки, строка затем разблокирована и свободна для вращения. Я уже закодировал запирающую часть с помощью кнопки. Я хотел бы удалить кнопку и заменить ее на выделенную опцию выбора.
Я пытался:
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
}
По-видимому, это срабатывает только в том случае, если строка еще не выбрана, поэтому, когда я касаюсь строки, которая находится в выделенной области, это событие не срабатывает.
Затем я попробовал
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"touchesBegan");
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"touchesMoved");
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"touchesEnded");
}
Ни одно из этих событий не срабатывает при прикосновении к сборщику.
Есть идеи о том, как определить, когда выделенная/выбранная строка в палитре задета пользователем?
3 ответа:
Ну , есть простой обходной путь, который сделал именно то, что я хотел сделать. В основном я хотел, чтобы пользователь нажимал на панель выбора в многокомпонентном представлении выбора и блокировал этот компонент, в то время как другие могут свободно вращаться.
Вот что я сделал:
Первый-выключите опцию отображения панели выбора.
Во-вторых-создайте три метки - по одной для каждого компонента-метки имеют ту же высоту и расположение, что и панель селектора, но есть одна поверх каждый элемент. Они носили друг друга, чтобы казаться прочным бруском.
Третье-создайте метод изменения цвета метки, чтобы указать, что она заблокирована для пользователя. Я также использую логический флаг, чтобы программные процессы знали, когда компонент заблокирован.
- (IBAction) lockButtonPress:(id)sender { // determine which button was pressed.... int btnPressed = 0; if (leftSelectionBar.touchInside) btnPressed = 1; if (centerSelectionBar.touchInside) btnPressed = 2; if (rightSelectionBar.touchInside) btnPressed = 3; // we are not going to make this difficult -- images for different states..... default in viewWillShow switch (btnPressed) { case 1: if (lockSelected0) { lockSelected0 = FALSE; [leftSelectionBar setBackgroundColor:[UIColor blueColor]]; [leftSelectionBar setAlpha:0.25]; } else { lockSelected0 = TRUE; [leftSelectionBar setBackgroundColor:[UIColor redColor]]; [leftSelectionBar setAlpha:0.45]; } break; case 2: if (lockSelected1) { lockSelected1 = FALSE; [centerSelectionBar setBackgroundColor:[UIColor blueColor]]; [centerSelectionBar setAlpha:0.25]; } else { lockSelected1 = TRUE; [centerSelectionBar setBackgroundColor:[UIColor redColor]]; [centerSelectionBar setAlpha:0.45]; } break; case 3: if (lockSelected2) { lockSelected2 = FALSE; [rightSelectionBar setBackgroundColor:[UIColor blueColor]]; [rightSelectionBar setAlpha:0.25]; } else { lockSelected2 = TRUE; [rightSelectionBar setBackgroundColor:[UIColor redColor]]; [rightSelectionBar setAlpha:0.45]; } break; default: break; } }
И это все.... просто ;)
(void)pickerView: (UIPickerView *) thePickerView didSelectRow: (NSInteger)строка inComponent: (NSInteger)компонент { // Пользовательский код здесь
//например, если у вас есть NSArray или NSMutableArray с именем "list", значения которого отображаются в UIPickerView - [list objectAtIndex:row], где row-индекс, возвращаемый событием UIPickerView, вернет сам объект.
}
Следующий фрагмент кода перехватит жесты касания на
UIPickerView
и определит, было ли нажатие в пределах индикатора выбораUIPickerView
:Во-первых, мы добавим
UITapGestureRecognizer
для перехвата жестов касания. Заметьте, что мы не хотим отменять прикосновения, потому чтоUIPickerView
все равно должен делать это, вращая колесо и все такое.Во-вторых, мы проверим, был ли кран в пределах индикатора выбора- (void)viewDidLoad { [super viewDidLoad]; UITapGestureRecognizer* gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(pickerViewTapGestureRecognized:)]; gestureRecognizer.cancelsTouchesInView = NO; [self.pickerView addGestureRecognizer:gestureRecognizer]; }
UIPickerView
(предполагая, что индикатор выбора использует около 15% высоты изUIPickerView
- Возможно, вам придется скорректировать это значение):- (void)pickerViewTapGestureRecognized:(UITapGestureRecognizer*)gestureRecognizer { CGPoint touchPoint = [gestureRecognizer locationInView:gestureRecognizer.view.superview]; CGRect frame = self.pickerView.frame; CGRect selectorFrame = CGRectInset( frame, 0.0, self.pickerView.bounds.size.height * 0.85 / 2.0 ); if( CGRectContainsPoint( selectorFrame, touchPoint) ) { NSLog( @"Selected Row: %i", [self.currentArticles objectAtIndex:[self.pickerView selectedRowInComponent:0]] ); } }
Вы должны не реализовать
- (void)pickerView:(UIPickerView*)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
Поскольку теперь мы обнаруживаем отбор самостоятельно.