首页 > 解决方案 > 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)

结果更好(至少文本是可读的),但仍然看起来不太好:

在此处输入图像描述

理想情况下,我希望可访问性模式视图具有与主视图中所选项目相同的背景颜色和色调颜色。

标签: iosuikitaccessibilityuisegmentedcontrol

解决方案


似乎没有任何公共 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 使用,因此您需要隐藏它。

如果您想自定义弹出框以使其看起来像您的分段控件,那将更加困难。白色选择矩形是一个图像,因此您需要对其进行修改,但还要考虑更改外观(亮/暗模式):

选择图像

我建议不要走那条路。默认外观弹出框应该足够好。


推荐阅读