pickerview example iphone uipickerview

iphone - uipickerview swift 4 example



Cómo cambiar el color de la fila seleccionada en UIPickerView (9)

// CGRectMake valores para el marco que nos gustaría

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;

// define la imagen que nos gustaría usar

UIImage *selectorImage = [UIImage imageNamed:@"selectionIndicator.png"]; UIView *customSelector = [[UIImageView alloc] initWithImage:selectorImage];

// establezca los valores de x e y al punto en el UIPickerView donde desea colocar la imagen

// establece los valores de ancho y alto al ancho y alto de tu imagen

customSelector.frame = CGRectMake(10,(myPickerView.bounds.size.height / 2) + 16, self.view.bounds.size.width – 10, 47);

// agrega el selectionIndicator personalizado también al mismo viewcontroller

[mainView addSubview:customSelector];

Ok, tal vez me esté perdiendo algo realmente simple y me disculpo si ese es el caso, sin embargo, he buscado en Google todas las permutaciones del título y no he encontrado! Así que esto es simplemente lo que quiero hacer: cambiar el color de fondo de la etiqueta que estoy usando como vista de fila en una vista de selección de 2 componentes cuando esa fila ha sido seleccionada. Así que pensé que esto funcionaría:

if (row == [pickerview selectedRowForComponent]) viewlabel.backgroundColor = redcolor;

pero esto no funciona. Parece elegir arbitrariamente qué fila colorear y, en ocasiones, incluso dar un error de acceso incorrecto. He intentado todas las diferentes cláusulas sin ningún efecto! ¡Cualquier sugerencia sería muy apreciada!

Aquí está el método completo:

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


El formato correcto para viewForPicker es:

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

El problema con el código anterior es: colorea las etiquetas, pero no el selector, en sí. Entonces, cuando se desplaza hacia uno u otro extremo, hay un espacio en blanco donde puede ver el fondo blanco. Configurar [myPicker setBackgroundColor ...] no hace lo que uno podría esperar.


Esto es lo que funcionó para mí:

  1. Agregue un UIView como una subvista a su UIPickerView
  2. Limítelo para que sea Y ingresado con su UIPickerView y tenga el mismo ancho
  3. Asígnele una altura igual a la altura de lo que devolvió en pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat
  4. Hazlo semitransparente y coloréalo como quieras.

* el resto de las soluciones (con vistas personalizadas para la fila o cadenas atribuidas para la fila) tenían errores al desplazarse rápidamente.


Implementación rápida

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


Llame a la instancia de -viewForRow:forComponent: método para obtener el objeto UIView * . A continuación, establezca el fondo UIColor esa vista.


No está claro dónde está colocando el código anterior. ¿Está en -pickerView:viewForRow:forComponent:reusingView: :? Aquí es donde debería estar. ¿Está seguro de que está manteniendo un puntero a la etiqueta para esa vista en particular? El hecho de que te estés estrellando sugiere que probablemente no lo estés. Un bloque de código más grande, incluido el lugar donde lo ha puesto, sería útil.


Normalmente, utilizo este método:

Uso la vista personalizada para mostrar el elemento de la fila

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

Cambio de color de la fila seleccionada con:

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { UILabel *labelSelected = (UILabel*)[pickerView viewForRow:row forComponent:component]; [labelSelected setTextColor:[UIColor redColor]]; }


Resuelto Declare 2 variables de instancia: selectedView, y oldView. Entonces el siguiente código hace el truco:

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;


UIPickerView tiene un delegado para establecer NSAttributeString para el título en la fila y el componente, podemos establecer el color del atributo como se muestra a continuación:

- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component { NSDictionary *attrs = @{NSForegroundColorAttributeName : [UIColor redColor]}; NSString *title = @"title" return [[NSAttributedString alloc] initWithString:title attributes:attrs];

}