Почему мои сегменты UISegmentControl выделяются в iOS 8, когда я устанавливаю фоновые изображения для всех состояний?

В iOS 6/7 я использовал UISegmentedControl с фоновыми изображениями, чтобы создать такой эффект:

Customized UISegmentedControl

Я выполнил это, установив фоновое изображение для UISegmentedControl для каждого из стандартных состояний, например:

UIImage *segmentedControlBackgroundImage = [UIImage imageNamed:@"profileSegmentedControlBackground"];
UIImage *segmentedControlBackgroundSelectedImage = [UIImage imageNamed:@"profileSegmentedControlBackgroundSelected"];

[self.segmentedControl setBackgroundImage:segmentedControlBackgroundImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[self.segmentedControl setBackgroundImage:segmentedControlBackgroundImage forState:UIControlStateDisabled barMetrics:UIBarMetricsDefault];
[self.segmentedControl setBackgroundImage:segmentedControlBackgroundSelectedImage forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];
[self.segmentedControl setBackgroundImage:segmentedControlBackgroundSelectedImage forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];

Когда сегмент становится выделенным или подсвечивается, он имеет симпатичную синюю полосу внизу, и я устанавливаю атрибуты текста, чтобы изменить цвет текста на синий. Там есть дополнительный код для разделителей, но я думаю, что это не связано, поэтому я опустил его.

Моя проблема в том, что в iOS 8 есть несколько действий, которые заставляют фон сегмента седеть и выглядеть плохо; Когда вы меняете свой выбор, ячейка, которую вы набрали, становится серым до тех пор, пока переход не завершится, а другой - если вы нажмете и удерживаете уже выбранный сегмент, он станет серым. Оба они выглядят одинаково и могут быть видны ниже.

UISegmentedControl with strange highlighting

Некоторые дополнительные фрагменты возможной информации:

  • tintColor для segmentedControl ясен
  • Я не подклассы UISegmentedControl
  • Я не изменил никаких свойств для UISegmentedControl, используя его внешний прокси-сервер
  • Я использую 1-точечные изображения для фоновых изображений, а UISegmentedControl автоматически определяет capInsets и строит изображение

Ответ 1

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

В вашем случае вызов:

[self.segmentedControl setBackgroundImage:segmentedControlBackgroundSelectedImage forState:UIControlStateSelected | UIControlStateHighlighted barMetrics:UIBarMetricsDefault];

должна исправить эту проблему.

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

Я не мог воспроизвести этот, но, возможно, это исправит обе проблемы.

Ответ 2

На всякий случай, в Swift это будет

segmentedControl.setBackgroundImage(image, forState:[.Selected, .Highlighted], barMetrics:.Default)