【问题标题】:UISegmentedControl accessibility mode stylingUISegmentedControl 可访问性模式样式
【发布时间】:2021-11-29 16:09:39
【问题描述】:

我正在为我的分段控件设置颜色,如下所示:

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)

结果更好(至少文字可读),但还是不好看:

理想情况下,我希望辅助功能模式视图具有与主视图中相同的背景颜色和色调颜色。

【问题讨论】:

    标签: ios uikit accessibility uisegmentedcontrol


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢!是的,默认外观对我来说没问题。
    猜你喜欢
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 2020-02-15
    • 2011-08-12
    • 2020-05-01
    • 2023-01-20
    相关资源
    最近更新 更多