UISegmentedControl无障碍模式背景与选中态颜色配置问题
问题根因
你遇到的异常是UISegmentedControl在系统开启动态类型(大字体)功能时,默认启用了UILargeContentViewer长按预览交互,系统生成的预览视图没有复用你自定义的控件背景色、选中色配置,才会出现文字对比度不足无法阅读的问题。
更优实现方案
按优先级推荐两种方案:
方案1:禁用大字体长按预览(优先推荐)
如果不需要保留大字体下的长按预览功能,直接关闭该交互即可从根源解决样式异常问题,适配iOS15及以上系统:
if #available(iOS 15.0, *) { segmentedControl.showsLargeContentViewer = false }
关闭后控件交互逻辑和普通模式完全一致,不会弹出额外预览视图,也不需要额外调整样式。
方案2:自定义预览视图样式(需要保留预览功能时使用)
如果要保留大字体下的预览交互,可以直接配置大内容查看器的样式参数,让预览和你自定义的控件样式保持一致:
if #available(iOS 15.0, *) { var config = UILargeContentViewerConfiguration() // 预览背景色和你设置的segment背景一致 config.backgroundColor = .gray // 预览选中项的tint色和自定义选中色一致 config.preferredTintColor = .red segmentedControl.largeContentViewerConfiguration = config }
低版本兼容方案
iOS14及以下系统没有上述官方API,你现有的给文本加背景色的方案是兼容性最好的实现,可新增动态类型判断,仅在大字体模式下生效,避免普通模式下文本周围出现多余背景色的违和感:
// 仅当系统字体大于默认大小时才添加文本背景 if traitCollection.preferredContentSizeCategory > .large { 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) }
内容的提问来源于stack exchange,提问作者algrid
相关产品推荐
相关产品推荐

