2011-04-21 42 views
6

Me gustaría cambiar el fondo blanco en un UIPickerView a una imagen propia.Personalizar UIPickerView (fondo y espaciado)

¿Esto es posible?

Además, he logrado hacer que mi UIPickerView se desplace horizontalmente en lugar de vertical. Ahora, me gustaría saber si hay alguna forma de ajustar el espacio entre dos filas de la vista del selector.

He adjuntado una imagen para mostrar lo que quiero decir.

Este es mi código:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 

    arrayDays = [[NSMutableArray alloc] init]; 
    [arrayDays addObject:@"ONSDAG"]; 
    [arrayDays addObject:@"TORSDAG"]; 
    [arrayDays addObject:@"FREDAG"]; 
    [arrayDays addObject:@"LØRDAG"]; 

    arrayDates = [[NSMutableArray alloc] init]; 
    [arrayDates addObject:@"29. JUNI"]; 
    [arrayDates addObject:@"30. JUNI"]; 
    [arrayDates addObject:@"1. JULI"]; 
    [arrayDates addObject:@"2. JULI"]; 

    pickerViewDay = [[UIPickerView alloc] initWithFrame:CGRectZero]; 
    [pickerViewDay setDelegate:self]; 
    [pickerViewDay setShowsSelectionIndicator:NO]; 
    CGAffineTransform rotate = CGAffineTransformMakeRotation(-M_PI/2); 
    rotate = CGAffineTransformScale(rotate, 0.25, 2.0); 
    [pickerViewDay setTransform:rotate]; 
    [pickerViewDay setCenter:CGPointMake(self.view.frame.size.width/2, (pickerViewDay.frame.size.height/2)-3)]; 
    [self.view addSubview:pickerViewDay]; 

    // Adding selection indicator to pickerview 
    UIImage *selectorImage = [UIImage imageNamed:@"DayPickerView_SelectionIndicator.png"]; 
    UIView *customSelector = [[UIImageView alloc] initWithImage:selectorImage]; 
    [customSelector setFrame:CGRectMake(0, 0, 120, 74)]; 
    [customSelector setCenter:CGPointMake(self.view.frame.size.width/2, customSelector.frame.size.height/2)]; 
    [self.view addSubview:customSelector]; 
    [customSelector release]; 

    // Adding background to pickerview 
    UIImage *backgroundImage = [UIImage imageNamed:@"DayPickerView_Background.png"]; 
    UIView *custombackground = [[UIImageView alloc] initWithImage:backgroundImage]; 
    [custombackground setFrame:CGRectMake(0, 0, 320, 74)]; 
    // [self.view addSubview:custombackground]; 
    [custombackground release]; 
} 

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view { 
    UIView *viewRow = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 150, 80)]; 

    CGAffineTransform rotate = CGAffineTransformMakeRotation(3.14/2); 
    rotate = CGAffineTransformScale(rotate, 0.25, 2.0); 

    // Date 
    CGRect rectDate = CGRectMake(30, 0, 150, 80); 
    UILabel *date = [[UILabel alloc]initWithFrame:rectDate]; 
    [date setTransform:rotate]; 
    [date setText:[arrayDates objectAtIndex:row]]; 
    [date setFont:[UIFont fontWithName:@"Arial-BoldMT" size:37.0]]; 
    [date setShadowColor:[UIColor whiteColor]]; 
    [date setShadowOffset:CGSizeMake(0, -1)]; 
    [date setTextAlignment:UITextAlignmentCenter]; 
    [date setBackgroundColor:[UIColor clearColor]]; 
    [date setClipsToBounds:YES]; 
    [viewRow addSubview:date]; 

    // Day 
    CGRect rectDay = CGRectMake(-30, 0, 150, 80); 
    UILabel *day = [[UILabel alloc]initWithFrame:rectDay]; 
    [day setTransform:rotate]; 
    [day setText:[arrayDays objectAtIndex:row]]; 
    [day setFont:[UIFont fontWithName:@"Arial-BoldMT" size:21.0]]; 
    [day setTextColor:[UIColor colorWithRed:0.35 green:0.35 blue:0.35 alpha:1]]; 
    [day setTextAlignment:UITextAlignmentCenter]; 
    [day setBackgroundColor:[UIColor clearColor]]; 
    [day setClipsToBounds:YES]; 
    [viewRow addSubview:day]; 

    return viewRow; 
} 

- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { 
    return [arrayDays objectAtIndex:row]; 
} 

- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component { 
    return [arrayDays count]; 
} 

Example

EDIT 1

Para RickiG (en el fondo):

@RickiG: Backgrounds are messed up and there are gaps

EDIT 2

Para RickiG:

@RickiG: Gaps in each side of the pickerview

Respuesta

5

Hola No hay una manera directa de cambiar el fondo. Lo que puede hacer es hacer que la vista que devuelve en la función viewForRow tenga su propio fondo (luego agregue la sombra en cada lado después si lo necesita). También puede buscar viewWithTag: pero eso nunca es una buena idea, ya que esto podría cambiar en futuras versiones de iOS.

¿Existe alguna razón especial para implementar tanto viewForRow como TitleForRow? Normalmente llego a llenar las etiquetas de viewForRow dentro de este método delegado.

El viewForRow tiene la capacidad de reutilizar las vistas en Picker, al igual que con UITableView debe probar si la "vista reusingView: (UIView *)" es nula y si no, no hay necesidad de volver a dibujar todo. Solo completa las etiquetas.

Normalmente nunca personalizo el selector, si necesito algo no completamente personalizado, subclasifica el UITableView, es mucho más flexible y puede hacer lo que el selector hace + más.

Para la separación se puede utilizar la "altura" de las filas, el selector se centrará las vistas que volver en viewForRow, a continuación, sólo asegúrese de que:

- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component 

devuelve un valor más grande que su punto de vista.

Held lykke og;)

+0

Muchas gracias por la información sobre el espaciado. ¡Eso es perfecto! Parece que no puedo establecer el fondo de la manera que mencionas, ya que habrá una brecha entre las vistas de los fondos. Creo que esto se debe al espaciado. Además, el fondo se ve extraño (tiene dos "sombras", se supone que solo tiene uno en la parte superior) Verifique mi primera publicación. – simonbs

+0

Bueno, si su imagen de fondo no se ajusta al tamaño del componente, habrá un espacio. Puedes hacer que el fondo tenga el mismo tamaño que el componente o tal vez usar stretchableImage para que el UIImage se ajuste al componente. – RickiG

+0

Tenías razón. Jugué alrededor del ancho del ancho de las etiquetas, la vista y la imagen y no el fondo para las vistas están bien. Sin embargo, tengo un espacio en cada lado de la vista de selección. ¿Sabes si hay alguna manera de establecer un fondo allí? Para el efecto de sombra, podría poner una imagen encima de la vista de selección. Eso sería perfecto, pero aún necesitaría el fondo en sí mismo. Verifique mi primera publicación para una imagen. – simonbs

0

Cómo sobre la adición de una vista vacío a la derecha de las etiquetas? Y para el fondo probablemente deberías usar el método insertSubview:aboveView: con la vista de fondo predeterminada como el segundo parámetro (si puedes acceder a él).

+0

Parece un enfoque un poco arriesgado. A medida que se apilan las vistas y hasta que los objetos se agregan a UIPickerView, el número de subvistas es cero. Si tienes una forma más exacta en tu mente, házmelo saber. Parece que no puedo hacer que esto funcione correctamente. – simonbs

4

Me acabo de descubrir cómo aplicar color o imagen de fondo en la vista selector. Espero que pueda ayudar a alguien.

apenas define una categoría en el archivo en el que desea que selector de vista de la siguiente manera:

@implementation UIPickerView(Extension) 

-(void)drawRect:(CGRect)rect 
{ 

    NSArray* subviews = [self subviews]; 
    for(UIView* view in subviews) 
    { 
     if([view isKindOfClass:[UITableView class]]) 
     { 
      view.backgroundColor = appColor; 
     } 
    } 
    [super drawRect:rect]; 
} 

@end 

Usted puede mirar más a fondo en subviews una mayor personalización.

1

Parece que este es un viejo hilo, pero en iOS 7 (posiblemente antes, no estoy seguro), UIPickerViews tienen una propiedad de color de fondo, lo que establecer el color de fondo es simple:

[pickerView setBackgroundColor:[UIColor whiteColor]];

Establecer una imagen de fondo es igualmente simple gracias a [UIColor colorWithPatternImage:]. (Tenga en cuenta que el patrón de azulejos y baldosas si la imagen es menor que el UIPickerView.)

[pickerView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"someBackgroundImage.png"]]]; 

Para modificar el ancho de componentes que puede implementar el método delegado widthForComponent con el fin de establecer diferentes anchuras para cada componente. En teoría, debería poder agregar un componente vacío y usar su ancho en blanco para crear espacios, pero no lo he intentado.

- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component; 

no han sido capaces de encontrar una manera de cambiar el relleno entre componentes que parece ser una manera más agradable para modificar el espaciamiento y que también le permite eliminar el ~ 5 espaciado de píxeles entre los componentes, pero si Puedo encontrar uno. Actualizaré mi respuesta.