UIPickerView - событие вызывается при выделении строки - PullRequest
2 голосов
/ 28 октября 2009

Я бы хотел сделать следующее:

Отображается 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 голосов
/ 05 ноября 2009

Ну, есть простой обходной путь, который сделал именно то, что я хотел достичь. По сути, я хотел, чтобы пользователь коснулся панели выбора в представлении многокомпонентного средства выбора и чтобы этот компонент был заблокирован, в то время как другие могут свободно вращаться.

Вот что я сделал:

Первый - отключить опцию отображения строки выбора.

Второй - создайте три метки - по одной для каждого компонента - метки имеют ту же высоту и местоположение, что и панель выбора, но есть одна над каждым компонентом Они, кроме друг друга, выглядят как сплошная полоса.

Третий - создать метод для изменения цвета метки, чтобы указать, что она заблокирована для пользователя. Я также использую логический флаг, чтобы программа знала, когда компонент заблокирован.

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

И это все .... просто;)

0 голосов
/ 28 мая 2012

Следующий фрагмент кода будет перехватывать жесты касания на 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

, так как теперь мы сами определяем выбор.

0 голосов
/ 07 января 2011

(void) pickerView: (UIPickerView *) thePickerView didSelectRow: (NSInteger) строка inComponent: (NSInteger) компонент { // Пользовательский код здесь

// Например, если у вас есть NSArray или NSMutableArray, называемый «список», значения которого отображаются в UIPickerView - [list objectAtIndex: row], где row - это индекс, возвращаемый событием UIPickerView, вернет сам объект.

}

...