2012-06-25 9 views
5

Ustawiam wygląd segmentowanej kontroli za pomocą tych instrukcji w delegacie aplikacji.Dziwne zachowanie z UISegmentedControl i 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]; 

Wynik jest poprawny. Tła i dzielniki są ustawione poprawnie po wybraniu dowolnego segmentu (segment zamówienia jest wybierany domyślnie po pierwszym uruchomieniu aplikacji). Kiedy wybieram segment Release, jak widać poniżej wszystko wygląda dobrze.

enter image description here

Problemem jest to, kiedy wychodzę z widoku, a następnie z powrotem do widoku (I zapisać wybrany indeks i ustawić go w viewDidLoad aby ponownie wybrać segment), dzielnik jest nieprawidłowo ustawiony na jakiś nieznany powód.

enter image description here

Jeśli dotknij a następnie A-Z Release, koryguje się. Ten błąd występuje tylko wtedy, gdy widok po raz pierwszy się załadował, a wybranym segmentem był Release lub A-Z. Dzielnik zawsze wygląda dobrze po wybraniu Zamówienia i załadowaniu widoku.

Rozmiary obrazu: dzielnik ma szerokość 2 pikseli (wszystkie 3 obrazy mają ten sam rozmiar), tła mają po 2 piksele.

Wszelkie pomysły i wskazówki byłyby bardzo cenne, od 10 godzin staram się wyciągać włosy, próbując znaleźć rozwiązanie niedostępne.

+0

Wywołanie metody 'setNeedsDisplay' z' UISegmentedControl' po ustawieniu wybranego indeksu 'UISegmentedControl' w' viewDidLoad'. Może to rozwiąże problem. –

+0

Nie działa. W każdym razie dzięki! –

+0

Widzę również ten problem. Cholera :( – runmad

Odpowiedz

7

To jest błąd z UISegmentedControl, myślę. Możesz obejść go, ustawiając wybrany segment po pewnym opóźnieniu, aby czas kontrolny mógł się sam narysować. Nawet nie trzeba używać rzeczywiste opóźnienie, tylko coś takiego:

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

Gdzie setPreferences aktualizuje wartość swojego segmentowej kontroli.

+0

to działało tak dobrze, ale zastanawiam się, jaki może być faktyczny powód tego? – thesummersign

+1

ponieważ zostanie on wykonany po pierwszej pętli uruchamiania (kontrola segmentowana już wyciągnięty)! ten błąd jest znany z błędu i naprawiony w iOS 6 –

+0

mogę potwierdzić, że to działa, bardzo dziękuję – glasz