Странное поведение с UISegmentedControl и 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];

Результат в порядке. Фон и разделители устанавливаются правильно, когда я выбираю любой из сегментов (сегмент «Порядок» выбирается по умолчанию при первом запуске приложения). Когда я выбираю сегмент Release, как вы можете видеть ниже, все выглядит нормально.

введите описание изображения здесь

Проблема в том, что когда я выхожу из представления, а затем возвращаюсь в представление (я сохраняю выбранный индекс и устанавливаю его в viewDidLoad для повторного выбора сегмента), разделитель установлен неправильно по неизвестной причине.

введите описание изображения здесь

Если я нажму на A-Z, а затем отпустите, он исправится. Эта ошибка возникает только тогда, когда представление загружается впервые и выбран сегмент Release или A-Z. Разделитель всегда выглядит нормально, когда выбран порядок и загружается представление.

Размеры изображения: разделитель имеет ширину 2 пикселя (все 3 изображения одинакового размера), ширина каждого фона - 2 пикселя.

Любые идеи или подсказки были бы очень признательны, я тянул за волосы последние 10 часов, пытаясь найти решение для недоступного.


person Asem H.    schedule 25.06.2012    source источник
comment
Вызовите setNeedsDisplay метод UISegmentedControl после того, как вы установите выбранный индекс UISegmentedControl в viewDidLoad. Может быть, это решит проблему.   -  person Zeus Alexander    schedule 25.06.2012
comment
Я тоже вижу эту проблему. Проклятие :(   -  person runmad    schedule 13.09.2012
comment
Обходной путь @runmad ниже, если вы все еще ищете ...   -  person jrturton    schedule 08.10.2012


Ответы (1)


Думаю, это ошибка UISegmentedControl. Вы можете обойти это, установив выбранный сегмент после задержки, чтобы позволить контрольному времени нарисовать себя. Вам даже не нужно использовать фактическую задержку, просто что-то вроде:

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

Где setPreferences обновляет значение вашего сегментированного элемента управления.

person jrturton    schedule 08.10.2012
comment
это сработало так хорошо. Но мне интересно, в чем может быть настоящая причина этого? - person thesummersign; 27.12.2012
comment
потому что это будет выполнено после первого цикла выполнения (сегментированный элемент управления уже нарисован)! эта ошибка известна и исправлена ​​в iOS 6 - person Mathias Aichinger; 15.03.2013
comment
Эта ошибка, как ни странно, снова появляется в ios7 - person holierthanthou84; 05.03.2014