iOS 13对UISegmentedControl进行了一些更改,包括在切换所选段时非常漂亮的动画。但是,我注意到它没有正确显示backgroundColor
属性,它似乎总是有点偏色。
我见过一些回答如何设置selectedSegmentTintColor
的问题,但我一直在努力将backgroundColor
设置为.white
,无论我做什么,它甚至总是显示出一点灰色尽管没有应用tintColor
或类似设置。将backgroundColor
设置为其他颜色可显示相同的行为,但用白色最为明显。更令人迷惑的是,虽然这种差异在iOS 13模拟器和运行iOS 13的物理设备上均会显示,但视觉调试器(在XCode 11 GM2中)并未显示出这种差异!
以下是几个屏幕快照,显示即使backgroundColor
的UISegmentedControl
设置为与它后面显示的视图的backgroundColor
相同,它们也略有不同。
运行iOS 13的设备(白色backgroundColor)
Visual Debugger中显示的相同视图/代码(白色backgroundColor)
运行iOS 13的设备(蓝色backgroundColor)
我已经尝试过按照本SO帖子中的建议应用backgroundImage
的建议:UISegmentedControl iOS 13 clear color,但最终将样式恢复为iOS 12中的外观,同时也会丢失漂亮的动画。
非常感谢任何指导或建议!我还向Apple提交了错误报告,请查看是否有任何错误。
将此扩展名用于iOS13中的现有段控制器
extension UISegmentedControl
{
func setOldLayout(tintColor: UIColor)
{
let bg = UIImage(color: .clear, size: CGSize(width: 1, height: 32))
let devider = UIImage(color: tintColor, size: CGSize(width: 1, height: 32))
//set background images
self.setBackgroundImage(bg, for: .normal, barMetrics: .default)
self.setBackgroundImage(devider, for: .selected, barMetrics: .default)
//set divider color
self.setDividerImage(devider, forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default)
//set border
self.layer.borderWidth = 1
self.layer.borderColor = tintColor.cgColor
//set label color
self.setTitleTextAttributes([.foregroundColor: tintColor], for: .normal)
self.setTitleTextAttributes([.foregroundColor: UIColor.white], for: .selected)
}
}
extension UIImage {
convenience init(color: UIColor, size: CGSize) {
UIGraphicsBeginImageContextWithOptions(size, false, 1)
color.set()
let ctx = UIGraphicsGetCurrentContext()!
ctx.fill(CGRect(origin: .zero, size: size))
let image = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
self.init(data: image.pngData()!)!
}
}
像这样直接使用
segmentedControl.setOldLayout(tintColor: .blue)