Переопределение выделенного выбора в UIPickerView

С новым плагином Android Gradle 3.x вам больше не нужно указывать версию для инструментов сборки (теперь вы можете удалить свойство android.buildToolsVersion).
По умолчанию плагин автоматически использует минимально требуемую версию инструментов сборки для версии плагина Android , которую вы используете.

Вы можете прочитать больше здесь .

8
задан Girish 6 June 2013 в 17:45
поделиться

4 ответа

Вам необходимо убедиться, что ваше настраиваемое представление имеет следующие свойства:

  1. Оно должно иметь те же размеры, которые ожидает UIPickerView на основе методов вашего делегата - pickerView : rowHeightForComponent: и pickerView: widthForComponent: . Если вы не указываете нестандартную высоту, высота по умолчанию - 44.
  2. Цвет фона должен быть [UIColor clearColor] .
  3. Вид должен улавливать все касания.

Один попался при использовании экземпляров UILabel в качестве настраиваемого представления UILabel по умолчанию userInteractionEnabled имеет значение NO ( UIView , на с другой стороны, по умолчанию для этого свойства используется значение ДА ).

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

- (UIView *)pickerView:(UIPickerView *)pickerView
            viewForRow:(NSInteger)row
          forComponent:(NSInteger)component
           reusingView:(UIView *)view {

  UILabel *pickerRowLabel = (UILabel *)view;
  if (pickerRowLabel == nil) {
    // Rule 1: width and height match what the picker view expects.
    //         Change as needed.
    CGRect frame = CGRectMake(0.0, 0.0, 320, 44);
    pickerRowLabel = [[[UILabel alloc] initWithFrame:frame] autorelease];
    // Rule 2: background color is clear. The view is positioned over
    //         the UIPickerView chrome.
    pickerRowLabel.backgroundColor = [UIColor clearColor];
    // Rule 3: view must capture all touches otherwise the cell will highlight,
    //         because the picker view uses a UITableView in its implementation.
    pickerRowLabel.userInteractionEnabled = YES;
  }
  pickerRowLabel.text = [pickerDataArray objectAtIndex:row];  

  return pickerRowLabel;
}
16
ответ дан 3 November 2019 в 14:03
поделиться

Я думаю, вы можете захотеть посмотрите на свойство "showsSelectionIndicator" UIPickerView

0
ответ дан 3 November 2019 в 14:03
поделиться

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

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {

    UILabel *pickerRowLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 316, 40)];
    pickerRowLabel.backgroundColor = [UIColor whiteColor];
    pickerRowLabel.text = [pickerDataArray objectAtIndex:row];  
    [self.view addSubview:pickerRowLabel];

    return pickerRowLabel;

}

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

0
ответ дан 3 November 2019 в 14:03
поделиться

Установка свойства userInteractionEnabled для UILabel на YES устраняет проблему с выделением, но также отключает UIPickerView из автопрокрутки для выбора строки, к которой прикоснулись.

Если вы хотите отключить режим выделения, но сохранить функцию автоматической прокрутки UIPickerView по умолчанию, вызовите функцию setShowSelection в экземплярах UITableCell , содержащихся в UIPickerView . Один из способов сделать это - создать подкласс класса UILabel , подобный следующему:

PickerViewLabel.h -

#import <UIKit/UIKit.h>

@interface PickerViewLabel:UILabel 
{
}

@end

PickerViewLabel.m -

#import "PickerViewLabel.h"

@implementation PickerViewLabel

- (void)didMoveToSuperview
{
 if ([[self superview] respondsToSelector:@selector(setShowSelection:)])
 {
  [[self superview] performSelector:@selector(setShowSelection:) withObject:NO];
 }
}

@end

Затем, если вы ранее возвращали экземпляр UILabel в pickerView: viewForRow: forComponent: reusingView: , вернуть экземпляр PickerViewLabel . Например, используя код из Дуга , вы должны заменить все регистры « UILabel » на « PickerViewLabel ». Просто не забудьте удалить строку pickerRowLabel.userInteractionEnabled = YES; .

12
ответ дан 3 November 2019 в 14:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: