Как изменить цвет выбранной строки в UIPickerView
Хорошо, может быть, я пропустил что-то очень простое, и я извиняюсь, если это дело, однако, я искал каждую перестановку названия и не нашел! Так что это просто то, что я хочу сделать: изменить цвет фона метки, которую я использую, в качестве представления строки в 2-х компонентном сортировщике, когда эта строка выбрана. Поэтому я думал, что это сработает:
if (row == [pickerview selectedRowForComponent])
viewlabel.backgroundColor = redcolor;
но это не работает. Кажется, произвольно выбирает, какая строка должна быть цветной, а иногда даже давать плохую ошибку доступа. Я пробовал всевозможные предложения безрезультатно! Все предложения были бы очень благодарны!
Здесь полный метод:
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
if (component == kNumberComponent) {
#define PICKER_LABEL_FONT_SIZE 24
#define PICKER_LABEL_ALPHA 1.0
// UIFont *font = [UIFont boldSystemFontOfSize:PICKER_LABEL_FONT_SIZE];
UIFont *font = [ UIFont fontWithName:@"AppleGothic" size:24];
UILabel *carsLabel =[ [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 75, 50) ]autorelease];
//[picker selectRow:row inComponent:component animated:YES];
NSString *pickerText = [self.numbers objectAtIndex:(int)row];
carsLabel.text = pickerText;
carsLabel.textAlignment = UITextAlignmentCenter;
NSLog(@"carsLabel = %@",carsLabel.text);
//carsLabel.text = @"maybe because the string isn't long enough";
carsLabel.textColor = [UIColor blackColor];
carsLabel.font = font;
carsLabel.opaque = YES;
[view addSubview:carsLabel];
return carsLabel;
} else {
UIFont *font = [ UIFont fontWithName:@"AppleGothic" size:18];
UILabel *carsLabel = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 225, 50)] autorelease];
id fact = [self.facts objectAtIndex:(int)row];
NSString *pickerText = @"Dictionary Entry";
if ( [fact isKindOfClass:[NSString class]]) {
pickerText = [self.facts objectAtIndex:(int)row];
}
carsLabel.text = pickerText;
carsLabel.textAlignment = UITextAlignmentCenter;
NSLog(@"carsLabel = %@",carsLabel.text);
//carsLabel.text = @"maybe because the string isn't long enough";
carsLabel.textColor = [UIColor blackColor];
carsLabel.font = font;
if ( row == 0) {
carsLabel.backgroundColor = [UIColor redColor];
}
//carsLabel.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"blackboard.png"]];;
carsLabel.opaque = YES;
[view addSubview:carsLabel];
return carsLabel;
}
return nil;
}
Ответы
Ответ 1
Решено! Объявите 2 переменные экземпляра: selectedView и oldView. Затем следующий код выполняет трюк:
if (self.oldView != nil)
self.oldView.backgroundColor = [UIColor clearColor];
self.selectedView = [picker viewForRow:row forComponent:kNumberComponent];
self.selectedView.backgroundColor = [UIColor redColor];
[self.selectedView setNeedsDisplay];
self.oldView = self.selectedView;
Ответ 2
Обычно я использую этот метод:
Я использую пользовательское представление для отображения элемента строки
-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
UILabel *label = (id)view;
if (!label)
{
label= [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, [pickerView rowSizeForComponent:component].width, [pickerView rowSizeForComponent:component].height)];
label.textAlignment = NSTextAlignmentCenter;
label.textColor = [UIColor whiteColor];
label.text = _arrayStringPicker[row];
}
return label;
Я меняю цвет строки, выбранной с помощью:
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
UILabel *labelSelected = (UILabel*)[pickerView viewForRow:row forComponent:component];
[labelSelected setTextColor:[UIColor redColor]];
}
Ответ 3
Правильный формат для viewForPicker:
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
UILabel *label = (UILabel*) view;
if (label == nil)
{
label = [[UILabel alloc] init];
}
[label setText:@"Whatever"];
// This part just colorizes everything, since you asked about that.
[label setTextColor:[UIColor whiteColor]];
[label setBackgroundColor:[UIColor blackColor]];
CGSize rowSize = [pickerView rowSizeForComponent:component];
CGRect labelRect = CGRectMake (0, 0, rowSize.width, rowSize.height);
[label setFrame:labelRect];
return label;
}
Проблема с приведенным выше кодом заключается в следующем: он раскрашивает метки, но не сам сборщик. Итак, когда вы катитесь к одному или другому, там пустое место, где вы можете увидеть белый фон. Установка [myPicker setBackgroundColor...] не делает того, на что можно надеяться.
Ответ 4
//CGRectMake значения для кадра wed, как
UIPickerView *myPickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0,0, self.view.bounds.size.width, self.view.bounds.size.height)];
// add the UIPickerView to your viewcontroller [mainView addSubview:myPickerView];
// set the selectionindicator to none myPickerView.showsSelectionIndicator = NO;
//определим образ, который мы хотели бы использовать
UIImage *selectorImage = [UIImage imageNamed:@"selectionIndicator.png"];
UIView *customSelector = [[UIImageView alloc] initWithImage:selectorImage];
//установите значения x и y в точку на UIPickerView, где вы хотите поместить изображение
//задайте значения ширины и высоты для ширины и высоты вашего изображения
customSelector.frame = CGRectMake(10,(myPickerView.bounds.size.height / 2) + 16, self.view.bounds.size.width – 10, 47);
//добавьте пользовательский элемент selectionIndicator к тому же viewcontroller
[mainView addSubview:customSelector];
Ответ 5
Быстрая реализация
extension PickerViewController: UIPickerViewDelegate {
func pickerView(pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {
var color: UIColor!
if pickerView.selectedRowInComponent(component) == row {
color = UIColor.redColor()
} else {
color = UIColor.blackColor()
}
let attributes: [String: AnyObject] = [
NSForegroundColorAttributeName: color,
NSFontAttributeName: UIFont.systemFontOfSize(15)
]
return NSAttributedString(string: rows[row], attributes: attributes)
}
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
//this will trigger attributedTitleForRow-method to be called
pickerView.reloadAllComponents()
}
}
Ответ 6
Вызвать метод UIPickerView
instance -viewForRow:forComponent:
, чтобы получить объект UIView *
. Затем установите этот фон вида UIColor
.
Ответ 7
Непонятно, куда вы помещаете вышеуказанный код. Это в -pickerView:viewForRow:forComponent:reusingView:
? Вот где это должно быть. Вы уверены, что поддерживаете указатель на метку для этого конкретного вида? Тот факт, что вы терпите крах, говорит о том, что вы, вероятно, нет. Было бы полезно использовать более крупный блок кода, включая, где вы его разместили.
Ответ 8
Вот что сработало для меня:
- Добавьте
UIView
в качестве подзаголовка к вашему UIPickerView
- Ограничьте его, чтобы он был введен с вашим
UIPickerView
и имел ту же ширину
- Дайте ему высоту, равную высоте того, что было возвращено в
pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat
- Сделайте его полупрозрачным и покрасьте так, как хотите.
* остальные решения (с пользовательскими представлениями для строк или атрибутов stringsfor row) были ошибочными при быстрой прокрутке.