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 2

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

Поскольку теперь мы обнаруживаем отбор самостоятельно.