2009-06-05 11 views
8

tengo una costumbre UIPickerView donde utilizo:Anulación de la selección resaltada en UIPickerView

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

para poblar la recogida de material con UILabels. ¿Hay alguna manera de desactivar el comportamiento de resaltar la fila seleccionada cuando se toca?

Creo que esto es una propiedad del subyacente UITableViewCell inherente en el UIPickerView y no puedo encontrar la manera de cambiarlo.

Respuesta

16

Usted necesita asegurarse de que su vista personalizada tiene las siguientes propiedades:

  1. Tiene que ser dimensionada para las mismas dimensiones que el UIPickerView espera función de los métodos de delegado - pickerView:rowHeightForComponent: y pickerView:widthForComponent:. La altura predeterminada es 44 si no especifica una altura personalizada.
  2. El color de fondo debe ser [UIColor clearColor].
  3. La vista debe capturar todos los toques.

El uno Gotcha utilizando UILabel casos como la vista personalizada es que UILabel valores predeterminados userInteractionEnabled-NO (UIView, por otro lado, valores predeterminados esta propiedad a YES).

Según estos requisitos, el código de ejemplo de Halle se puede reescribir de la siguiente manera. Este ejemplo también reutiliza correctamente las vistas creadas previamente, lo cual es necesario para un rendimiento de desplazamiento rápido.

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

supongo que puede que desee ver en la propiedad "showsSelectionIndicator" de UIPickerView

+0

El showsSelectionIndicator se encarga de mostrar la barra azul sobre el valor que será devuelto por el selector. Desafortunadamente, no tiene nada que ver con la estructura UITableViewCell subyacente. – Jon

0

No estoy seguro de si hay una manera fácil de eliminar el indicativo de selección, pero se puede cubrirlo si se hace el fondo de la etiqueta en blanco y tamaño a las mismas dimensiones que la selección azul rectángulo:

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

} 

con una anchura de 316 la etiqueta cubre todo menos una astilla de azul en cada lado, y en 320 se cubre completamente la selección pero también comienza a cubrir un poco los gradientes de la rueda exterior, lo que puede o no molestarle.

12

Al establecer la propiedad de userInteractionEnabledUILabel a YES corrige el problema de poner de relieve, pero también desactiva el UIPickerView de desplazamiento automático para seleccionar la fila que ha sido tocado.

Si desea desactivar el comportamiento resaltado, pero mantener la funcionalidad de desplazamiento automático por defecto el UIPickerView 's, llamar a la función setShowSelection en los UITableCell casos contenidos en el UIPickerView. Una forma de hacer esto es una subclase de la clase UILabel similar al siguiente:

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 

Luego, en el que previamente se había devolviendo una instancia de UILabel en pickerView:viewForRow:forComponent:reusingView:, devolver una instancia de PickerViewLabel. A modo de ejemplo, utilizando el código de Doug, debería reemplazar todos los casos de 'UILabel' con 'PickerViewLabel'. Solo recuerde eliminar la línea pickerRowLabel.userInteractionEnabled = YES;.

+0

Hola Christine, implementé el mismo código anterior, pero la selección azul sigue en ambos extremos de la fila seleccionada. Cuando intento depurar el código, descubro que didMoveToSuperview no se llama en ninguna parte. ¿Me puedes ayudar? Gracias. – engineer

+0

Hola Shailesh, es difícil decir sin ver tu código, pero tengo algunas ideas de por qué no se llamaría. 'didMoveToSuperview' es una función de UIView a la que se llama automáticamente cada vez que se agrega o quita una vista de UIView. ¿Está definitivamente agregando su vista personalizada a la pantalla? Si realiza una prueba rápida y agrega una instancia de su clase como una subvista de la vista de UIViewController, ¿ve que se llama a 'didMoveToSuperview'? Si no, supongo que tiene un error tipográfico en algún lugar de la declaración de la función. – Christine

+0

genial ... muchas gracias ... me salvaste la vida y montones de tiempo –

Cuestiones relacionadas