Существует довольно простой способ сделать это. Текущее поведение, очевидно, является ошибкой, поэтому это не идеальное решение, а просто обходной путь, который прекрасно работает. А именно, используйте дополнительный UIView в качестве «отключенной визуальной подсказки».
Общие шаги:
- Добавить UIView в качестве родственного элемента в UISegmentedControl. Убедитесь, что UIView находится перед UISegmentedControl
- Примените желаемый цвет и прозрачность к UIView в соответствии со скином вашего приложения
- Переместите UIView так, чтобы оно находилось точно над UISegmentedControl
- Сформируйте UIView, чтобы иметь точный размер UISegmentedControl
- Применить закругленный угол к UIView, чтобы отразить точную форму UISegmentedControl
Когда предполагается отключить UISegmentedControl, просто отобразите UIView и отключите взаимодействие с пользователем на UISegmentedControl.
Когда предполагается включить UISegmentedControl, просто скройте UIView и включите взаимодействие с пользователем в UISegmentedControl.
В обоих случаях не изменяйте свойство UISegmentedControl.enabled.
Обратите внимание, что это кажется большим количеством шагов, но все это может быть закодировано, так что добавление поддержки отключения вашего пользовательского UISegmentedControl становится в значительной степени 1 линией после добавления этого в метод настройки сегментированного управления.
Вот как выглядит мой пользовательский сегментный элемент управления при применении этого решения:
Включено сегментированное управление
«Отключено» Сегментированное управление
Вот некоторые интересные фрагменты кода:
Форма UIView для соответствия UISegementedControl (конфигурация времени загрузки)
UISegmentedControl* segmentedControl = ...
//Segmented Control disabled visual cue view
UIView* view = ...
//Step #2
view.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:0.6];
//Step #3 and #4
view.frame = segmentedControl.frame;
//Step #5
view.layer.cornerRadius = 5
view.clipsToBounds = YES;
//Ensure this is disabled by default
view.userInteractionEnabled = NO;
Включить / «Отключить» UISegementedControl (изменение состояния среды выполнения)
BOOL segmentedControlEnabled = ...
if(segmentedControlEnabled) {
segmentedControl.userInteractionEnabled = YES;
view.hidden = YES;
} else {
segmentedControl.userInteractionEnabled = NO;
view.hidden = NO;
}
Вот и все.
-