2009-06-08 13 views
18

Desidero modificare il colore del bordo di un UIPickerView. Non vedo una proprietà tint per UIPickerView. C'è un modo in cui questo potrebbe essere fatto? O una soluzione?Modifica sfondo UIPickerView

Grazie.

risposta

18

Se vuoi solo una soluzione, scatta una schermata nel simulatore, aprilo in Photoshop, ritaglialo solo nell'area UIPickerView, rendi il centro trasparente, applica qualsiasi tinta tu voglia, aggiungi quell'immagine al tuo progetto, e aggiungilo come UIImageView in cima a UIPickerView.

+0

Grazie. In nessun altro modo possiamo cambiare la tinta? – lostInTransit

+0

Credo che lo sfondo sia solo un'immagine, quindi è probabile che anche se fosse possibile trovare l'elemento nelle sottoview, non sarebbe tint-able. –

+0

come cambiare l'intero colore di sfondo di UIPickerView? provo personalizzare la vista utilizzare il metodo '- (UIView *) pickerView: (UIPickerView *) pickerView viewForRow: (NSInteger) fila forComponent: (NSInteger) Componente reusingView: (UIView *) vista " sebbene la vista fila è stato aggiornato ma il contenuto a sinistra del Picker mostra ancora il colore grigio originale ... come risolverlo? grazie ... – iXcoder

14

Il mio UIPickerView ha 3 componenti. E nessun indicatore di selezione.

Questo gli dà 11 sottoview. [[picker subviews] count]

Nascondere la prima e l'ultima sottoview rimuove totalmente lo sfondo.

[(UIView*)[[picker subviews] objectAtIndex:0] setHidden:YES]; 
[(UIView*)[[picker subviews] objectAtIndex:10] setHidden:YES]; 

nascondere ogni terzo altra visualizzazione secondaria (indici 1, 4 e 7) nasconde il fondo opaco sui componenti. Dando un bell'effetto che posso pelleare come desidero.

Speranza che aiuta qualcuno :)

+1

Non è davvero un hack? Apple potrebbe rifiutare un'app per fare questo ... – lostInTransit

+1

[[pick-in subpriews] count] restituisce 0. (Xcode 3.2.1) – Intentss

+0

Clever: anche se Apple potrebbe non piacervi – Moshe

1

actualy per correggere voi, si può mettere un actualy .png ontop del UIPickerView ed ancora utilizzare il Selettore vista, basta assicurarsi che il mezzo è trasparente o non si vedrà le file.

+0

Questo ha funzionato per me ed è stato davvero facile . –

27

È anche possibile mascherare il componente. Con un po 'fiddeling è possibile ottenere le dimensioni del componente e tagliare fuori con il seguente codice:

CALayer* mask = [[CALayer alloc] init]; 
     [mask setBackgroundColor: [UIColor blackColor].CGColor]; 
     [mask setFrame: CGRectMake(10.0f, 10.0f, 260.0f, 196.0f)]; 
     [mask setCornerRadius: 5.0f]; 
     [picker.layer setMask: mask]; 
     [mask release]; 

non dimenticate

#import <QuartzCore/QuartzCore.h> 
+5

In XCode 4+, è necessario il frame: [mask setFrame: CGRectMake (10.0f, 10.0f, 260.0f, 196.0f)] ;, ma in caso contrario molto utile e non richiede l'uso di sovrapposizioni di immagini. – Shaun

+0

soluzione molto intelligente, grazie Lukas –

+1

Interessante. Questo * quasi * funziona. Sembra che non stia tagliando tutto il lato destro. http://screencast.com/t/MVyxOIj0mGRT ... Modifica: non avrebbe più senso calcolare gli insiemi dal picker.bounds? – Barry

5

Il selettore non avrà subviews fino a quando è a pieno carico. Se si tenta di fare questo:

[(UIView*)[[picker subviews] objectAtIndex:0] setHidden:YES]; 
[(UIView*)[[picker subviews] objectAtIndex:10] setHidden:YES]; 

nel viewDidLoad o viewWillAppear non funzionerà. Tuttavia, ho spostato il mio in uno dei metodi del protocollo UIPickerView e rimosso il frame dello sfondo.

Probabilmente si potrebbe sottoclasse il selettore per farlo un po 'più efficientemente, ma preferisco evitare la sottoclasse.

Oh, anche, questo è probabilmente ovvio, ma se il tuo picker non ha elementi in esso, il codice sopra non cancellerà le viste secondarie.

2

È possibile modificare il colore di sfondo sostituendo completamente l'immagine di sfondo con uno di propria scelta utilizzando IXPickerOverlayViewavailable on GitHub (il repository contiene un esempio illustrato di utilizzo di questa classe).

Nota che dovrai tracciare lo sfondo (rettangolare) da zero ma a differenza di qualsiasi soluzione qui menzionata, questo approccio è completamente dinamico: il controllo apparirà correttamente anche se cambi il numero di ruote picker e le loro dimensioni in fase di esecuzione (come fa UIDatePicker quando si modificano le impostazioni locali del sistema).

Una volta ottenuta l'immagine di sfondo, utilizzare IXPickerOverlayView è semplice come aggiungere un'istanza IXPickerOverlayView nella parte superiore della vista Selezione e assegnare la proprietà hostPickerView.

0

Basta aggiungere questa linea ad uno dei vostri UIPickerView metodi:

[[[MyPicker subviews] objectAtIndex:4] setBackgroundColor: [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"image.png"]]]; 
+0

Per migliorare la qualità della risposta, includi come/perché il tuo post risolve il problema. –

+0

objectAtIndex: 4 ??? – Dmitry

4

Ecco una versione moderna, pixel-perfect w/ARC di risposta s' @Lukas, perché alcune domande non vanno mai fuori moda:

#import <QuartzCore/QuartzCore.h> 

// . . . 

CALayer* mask = [[CALayer alloc] init]; 
     mask.backgroundColor = [UIColor blackColor].CGColor; 
     mask.frame = CGRectInset(picker.bounds, 10.0f, 10.0f); 
     mask.cornerRadius = 5.0f; 
     picker.layer.mask = mask; 

Questa risposta funziona per qualsiasi dimensione della raccoglitrice b/c le dimensioni di livello vengono calcolate on-the-fly.

                                                                                                                                  enter image description here

+0

Speriamo che funzioni ancora quando esce iOS 7. :) – Barry

+0

Codice qui: https://gist.github.com/6361914 – Barry

0

È possibile effettuare le seguenti operazioni:

impostare il colore di sfondo vista picker da procedura guidata o per codice come segue:

Picker1.backgroundColor = [UIColor someColor];// clearColor for transparent 

Impostare il valore alfa per i subviews vista picker numerati 0, 1 e 3. (Don' so perché c'è il sottomenu 2 pensato). Esegui il codice dopo i primi dati di caricamento per la vista del selettore come segue (genererà un'eccezione se lo fai in DidViewLoad).

[(UIView*)[[Picker1 subviews] objectAtIndex:0] setAlpha:someValue];// 0.0f for transparent 
[(UIView*)[[Picker1 subviews] objectAtIndex:1] setAlpha:someValue]; 
[(UIView*)[[Picker1 subviews] objectAtIndex:3] setAlpha:someValue]; 

Non dimenticare di cancellare il colore di sfondo per l'etichetta che si sta inviando alla vista selettore nel metodo viewForRow.

lbl.backgroundColor = [UIColor someColor];// could be clearColor