Настройка UISegmentedControl в iOS 5
Вот моя проблема. Я настраиваю UISegmentedControl, устанавливая образы фона и разделителя следующим образом:
[[UISegmentedControl appearance] setDividerImage:segmentUnselectedUnselected forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UISegmentedControl appearance] setDividerImage:segmentSelectedUnselected forLeftSegmentState:UIControlStateSelected rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UISegmentedControl appearance] setDividerImage:segUnselectedSelected forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
[[UISegmentedControl appearance] setBackgroundImage:segmentUnselected forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UISegmentedControl appearance] setBackgroundImage:segmentSelected forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
Когда я пытаюсь сделать первый сегмент выбранным в viewDidLoad
self.segmentedControl.selectedIndex = 1;
Я получаю следующую странную вещь:
![enter image description here]()
вместо:
![enter image description here]()
Кто-нибудь знает, если это ошибка, и как я могу предоставить отчет об ошибке? Если нет, что может быть неправильным с моим кодом?
Ответы
Ответ 1
После некоторых тестов и попыток нескольких разных мест для настройки, я считаю, что это может быть ошибкой.
Даже с очень простым прямым UISegmentedControl, это то, что я получаю (используя Xcode 4.3.1, iOS 5.1):
После запуска и выбора среднего элемента в коде: ![After launching and selecting the middle element in code]()
После щелчка пользователя и нажатия на средний элемент: ![After user-clicked away and clicking back on middle element]()
Я использовал 3px широкоформатные изображения для разделителей и 1px широкие изображения для фона.
Изменить:
Я думаю, что нашел обходное решение: попробуйте выполнить команду для выбора элемента, а не выполнить его в viewDidLoad, например:
dispatch_async(dispatch_get_main_queue(),^{
self.segmentedControl.selectedSegmentIndex = 1;
});
В моем примере выше очередь выполнения этой команды заставляет ее работать нормально.
Ответ 2
Я думаю, что ваш образ CapInsets неверен, пожалуйста, удвоните пример в http://www.raywenderlich.com/4344/user-interface-customization-in-ios-5
Вот несколько кодов из учебника для быстрой справки:
UIImage *segmentSelected = [[UIImage imageNamed:@"segcontrol_sel.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 15, 0, 15)];
UIImage *segmentUnselected = [[UIImage imageNamed:@"segcontrol_uns.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 15, 0, 15)];
UIImage *segmentSelectedUnselected = [UIImage imageNamed:@"segcontrol_sel-uns.png"];
UIImage *segUnselectedSelected = [UIImage imageNamed:@"segcontrol_uns-sel.png"];
UIImage *segmentUnselectedUnselected = [UIImage imageNamed:@"segcontrol_uns-uns.png"];
[[UISegmentedControl appearance] setBackgroundImage:segmentUnselected forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UISegmentedControl appearance] setBackgroundImage:segmentSelected forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
[[UISegmentedControl appearance] setDividerImage:segmentUnselectedUnselected forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UISegmentedControl appearance] setDividerImage:segmentSelectedUnselected forLeftSegmentState:UIControlStateSelected rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UISegmentedControl appearance] setDividerImage:segUnselectedSelected forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
Ответ 3
Я выяснил, как решить проблему после того, как я провел много экспериментов.
Ваша проблема связана с неправильной настройкой ширины сегментов.
Первая точка - нам нужно выполнить настройку пользовательского интерфейса перед установкой ширины отдельных сегментов.
Вторая точка - нам нужно подсчитать ширину разделителя (-ов), и это очень важно. Когда мы выполняем настройку, разделитель является частью элементов UISegmentedControl. Разделитель не является наложением. Мы также должны подсчитать ширину разделителя.
Третья точка - когда мы используем метод ширины набора для сегментов, ширина сегмента не должна содержать ширину разделителя.
Если вы следуете приведенным выше правилам, вы получите идеальный настраиваемый UISegmentedControl.
Ответ 4
Вы пытались установить изменяемые по размеру изображения?
Например:
UIImage *segmentSelected = [[UIImage imageNamed:@"SegmentSelectedImage"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 5, 0, 5)];
[[UISegmentedControl appearance] setBackgroundImage:segmentSelected forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
Ответ 5
Вы можете попробовать инициализировать свои настройки внешнего вида раньше viewDidLoad
. В демонстрациях я видел, что это обычно делалось в application:didFinishLaunchingWithOptions:
, хотя любая точка до загрузки файла, содержащего настроенные представления, должна работать.
Ответ 6
У меня была такая же проблема, и я решил ее по-разному. Я просто прокомментировал эту строку кода:
self.pageController.segmentedControlStyle = UISegmentedControlStyleBar;
И панель сегментов изменила представление на нормальное состояние.