2012-06-25 24 views
5

Sto impostando l'aspetto del controllo segmentato tramite queste istruzioni nel delegato dell'app.Comportamento strano con UISegmentedControl e UIAppearance

[[UISegmentedControl appearance] setBackgroundImage:[[UIImage imageNamed:@"segmentation_normal.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0 , 0, 0)] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
    [[UISegmentedControl appearance] setBackgroundImage:[[UIImage imageNamed:@"segmentation_selected.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0 , 0, 0)] 
     forState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; 

    [[UISegmentedControl appearance] setDividerImage:[UIImage imageNamed:@"segmentation_divider_NormalNormal.png"] forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
    [[UISegmentedControl appearance] setDividerImage:[UIImage imageNamed:@"segmentation_divider_NormalSelected.png"] forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; 
    [[UISegmentedControl appearance] setDividerImage:[UIImage imageNamed:@"segmentation_divider_SelectedNormal.png"] forLeftSegmentState:UIControlStateSelected rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 

Il risultato è soddisfacente. Gli sfondi e i divisori sono impostati correttamente quando seleziono uno dei segmenti (il segmento Ordine è selezionato per impostazione predefinita all'avvio dell'app). Quando seleziono il segmento di rilascio come puoi vedere sotto, tutto sembra a posto.

enter image description here

Il problema è quando esco della vista poi di nuovo alla vista (posso conservare l'indice selezionato e metterlo nel viewDidLoad per selezionare nuovamente il segmento), il divisore è impostato in modo non corretto per qualche sconosciuta ragionare.

enter image description here

Se io batto su A-Z poi rilasciare, si corregge. Questo bug si verifica solo quando la vista viene caricata per la prima volta e il segmento selezionato è Release o A-Z. Il divisore appare sempre bene quando viene selezionato Ordine e la vista viene caricata.

Dimensioni immagine: il divisore è largo 2 px (tutte e 3 le immagini hanno le stesse dimensioni), gli sfondi sono larghi 2 px ciascuno.

Qualsiasi idea o suggerimento sarebbe molto apprezzata, mi sono tirato i capelli per le ultime 10 ore cercando di trovare una soluzione a non disponibile.

+0

Chiama il metodo 'setNeedsDisplay' di' UISegmentedControl' dopo aver impostato l'indice selezionato di 'UISegmentedControl' in' viewDidLoad'. Forse questo risolverà il problema. –

+0

Non ha funzionato. Grazie comunque! –

+0

Anche io sto vedendo questo problema. Accidenti :( – runmad

risposta

7

Questo è un bug con UISegmentedControl, penso. Puoi aggirare il problema impostando il segmento selezionato dopo un ritardo, per consentire al tempo di controllo di disegnare se stesso. Non hanno nemmeno bisogno di usare un ritardo effettivo, solo qualcosa di simile:

[self performSelector:@selector(setPreferences) withObject:nil afterDelay:0.0]; 

Dove setPreferences aggiorna il valore del vostro controllo segmentato.

+0

ha funzionato così bene, ma mi chiedo quale potrebbe essere il vero motivo dietro questo? – thesummersign

+1

perché verrà eseguito dopo il primo ciclo di esecuzione (controllo segmentato già disegnato)! questo bug è noto bug e corretto in iOS 6 –

+0

posso confermare questo funziona grazie mille – glasz