Подтвердить что ты не робот

Настройка 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

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

4b9b3361

Ответ 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;

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