Настройка UISegmentedControl в iOS 5 - PullRequest
27 голосов
/ 02 февраля 2012

Вот моя проблема. Я настраиваю 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];

Когда я пытаюсь выделить 1-й сегмент в пределах viewDidLoad

self.segmentedControl.selectedIndex = 1;

Я получаю следующую странную вещь:

enter image description here

вместо:

enter image description here

Кто-нибудь знает, если это ошибка и как я могу предоставить отчет об ошибке? Если нет, что может быть не так с моим кодом?

Ответы [ 6 ]

10 голосов
/ 15 марта 2012

После некоторых тестов и проб в нескольких местах для настройки, я считаю, что это действительно может быть ошибкой.

Даже с очень простым прямым 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

Я использовал изображения шириной 3 пикселя для разделителей и изображения шириной 1 пиксель для фона.

Редактировать : Я думаю, что нашел обходной путь: попробуйте поставить команду в очередь для выбора элемента, а не выполнять его в viewDidLoad, например:

dispatch_async(dispatch_get_main_queue(),^{
   self.segmentedControl.selectedSegmentIndex = 1;
});

В моем примере выше, постановка в очередь этой инструкции заставляет ее работать очень хорошо.

4 голосов
/ 04 сентября 2012

Я думаю, что ваше изображение 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];
1 голос
/ 23 февраля 2012

Вы пытались установить изменяемый размер изображений?

Например:

UIImage *segmentSelected = [[UIImage imageNamed:@"SegmentSelectedImage"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 5, 0, 5)];
[[UISegmentedControl appearance] setBackgroundImage:segmentSelected forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
1 голос
/ 06 февраля 2012

Я выяснил, как решить проблему после того, как провел много экспериментов.

Ваша проблема в неправильной настройке ширины для сегментов.

Первый момент - нам нужно сделатьНастройка пользовательского интерфейса перед установкой ширины отдельных сегментов.

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

Третья точка - когда мы используем метод задания ширины для сегментов, ширина сегмента не должна включать ширину делителя.

Если выследуя приведенным выше правилам, вы получите идеально настроенный UISegmentedControl.

0 голосов
/ 25 июля 2012

У меня была та же проблема, и я решил ее другим способом.Я только что прокомментировал эту строку кода:

self.pageController.segmentedControlStyle = UISegmentedControlStyleBar;

И сегментный бар изменил его вид на нормальное состояние.

0 голосов
/ 02 февраля 2012

Возможно, вы захотите попробовать инициализировать настройки внешнего вида раньше, чем viewDidLoad. В демонстрациях, которые я видел, это обычно делалось в application:didFinishLaunchingWithOptions:, хотя любая точка до загрузки пера, содержащего настроенные виды, должна работать.

...