我正在尝试在 iOS 13 中为正常状态设置分段控件的背景颜色。
我有与此处列出的相同的问题:如何在 iOS 13 中将 UISegmentedControl 的背景颜色设置为白色 https://stackoverflow.com/questions/58105920/how-to-set-backgroundcolor-of-uisegmentedcontrol-to-white-in-ios-13
上面链接中问题的答案没有帮助。我想保持 ios13 幻灯片动画行为,但也让正常状态段为白色而不是浅灰色。
分段控件中似乎有一个默认图像导致灰色/灰白色着色效果。
我尝试将背景图像设置为选定状态的颜色和 UIBarMetrics.default 的正常颜色,但这只是给了我 ios13 之前的行为
if #available(iOS 13, *) {
guard let selectedTintColor = selectedSegmentTintColor else { return }
let tintColorImage = selectedTintColor.asImage()
let backgroundColor = self.backgroundColor ?? UIColor.clear
setBackgroundImage(backgroundColor.asImage(), for: .normal, barMetrics: .default)
setBackgroundImage(tintColorImage, for: .selected, barMetrics: .default)
setBackgroundImage(selectedTintColor.withAlphaComponent(0.2).asImage(), for: .highlighted, barMetrics: .default)
setBackgroundImage(tintColorImage, for: [.highlighted, .selected], barMetrics: .default)
}
extension UIImage {
func asImage(_ size: CGSize = CGSize(width: 1, height: 1)) -> UIImage {
return UIGraphicsImageRenderer(size: size).image { rendererContext in
self.setFill()
rendererContext.fill(CGRect(origin: .zero, size: size))
}
}
}
//I also added the following to the View
override func layoutSubviews() {
super.layoutSubviews()
subviews.compactMap{ $0 as? UIImageView }.forEach {
$0.isHidden = $0.image == nil
}
}
使用最后一部分(layoutSubviews),我能够在进行分段选择之前看到白色背景颜色。在segmentedControlDidChange调用之后,白色消失了,并且默认选定的段在更改后也变成了灰色。但已经看不到任何文字了...
此信息来自我的视图调试器:
segmentedCOntrol 的 bgColor 为白色 -> 并且它包含
uiImageView 用于具有清晰图像且 bgColor 为零的所有片段
上面提到的 ^^ uiImageView 之上的所选片段具有正确的 selectedSegmentTintColor 作为附加 uiImageView,并且背景颜色仍然为零,但图像中具有正确的色调颜色
经过我的努力,我得到了与上面链接中的人相同的行为。在视图层次结构中,它将背景显示为白色,视觉表示显示正确的颜色。
这是一个错误吗?有谁知道如何克服这个问题?