ios - UISegmentedControl 可访问性模式样式
问题描述
我正在为我的分段控件设置颜色,如下所示:
segmentedControl.backgroundColor = .gray
segmentedControl.selectedSegmentTintColor = .red
let textAttrs: [NSAttributedString.Key : Any] = [
.foregroundColor: UIColor.white
]
segmentedControl.setTitleTextAttributes(textAttrs, for: .normal)
它运行良好,但是当用户长按它(在设置中启用大字体)时,我得到以下信息:
如您所见,文本不可读。有没有办法为可访问性视图设置背景/色调颜色?
我发现的最佳解决方案是为标题属性中的文本设置背景颜色,如下所示:
let textAttrs: [NSAttributedString.Key : Any] = [
.foregroundColor: UIColor.white,
.backgroundColor: segmentedControl.backgroundColor!
]
segmentedControl.setTitleTextAttributes(textAttrs, for: .normal)
let textAttrsSelected: [NSAttributedString.Key : Any] = [
.foregroundColor: UIColor.white,
.backgroundColor: segmentedControl.selectedSegmentTintColor!
]
segmentedControl.setTitleTextAttributes(textAttrsSelected, for: .selected)
结果更好(至少文本是可读的),但仍然看起来不太好:
理想情况下,我希望可访问性模式视图具有与主视图中所选项目相同的背景颜色和色调颜色。
解决方案
似乎没有任何公共 API 可以帮助您解决此问题。您应该向 Apple 提出反馈请求。
同时,如果您对一些 hacky 解决方法感兴趣,您可以覆盖您的控制器presentViewController:animated:completion:
并稍微“触摸”视图层次结构。
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
{
NSString* controllerClassName = NSStringFromClass(viewControllerToPresent.class);
if([controllerClassName hasPrefix:@"UIAccessibility"] && [controllerClassName containsString:@"Segmented"])
{
[[viewControllerToPresent valueForKey:@"segmentButtons"] enumerateObjectsUsingBlock:^(UIButton* _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
[obj setValue:nil forKeyPath:@"segment.appearanceStorage"];
}];
}
[super presentViewController:viewControllerToPresent animated:flag completion:completion];
}
如果您没有自定义分段控件,这将使弹出框显示出来:
如您所见,那里有一些私有 API 使用,因此您需要隐藏它。
如果您想自定义弹出框以使其看起来像您的分段控件,那将更加困难。白色选择矩形是一个图像,因此您需要对其进行修改,但还要考虑更改外观(亮/暗模式):
我建议不要走那条路。默认外观弹出框应该足够好。
推荐阅读
- mqtt - HiveMQ MQTT Client Java:有没有办法检查主题是否与订阅匹配?
- css - 如何使用 CSS 在侧边栏中添加自定义弯曲形状?
- reactjs - 如何从组件获取参数到 redux action creator
- esp32 - ESP32 开发板无法编译 ESP8266wifi.h 包含文件
- laravel - 我应该在 10 月 Cms 中在哪里声明整个应用程序的配置
- python - 使用 Python 读取摄像头图像世界在 webbots 中运行非常缓慢
- python - 无法使用查找我的设备功能给我的手机打电话。事实上,它甚至没有登录
- multithreading - 按条件分离 std::threads
- java - 获取空值?
- python - 如何在python中使用if语句时迭代pandas groupby对象