如何在iOS 13中将UISegmentedControl的backgroundColor设置为白色

问题描述 投票:6回答:1

iOS 13对UISegmentedControl进行了一些更改,包括在切换所选段时非常漂亮的动画。但是,我注意到它没有正确显示backgroundColor属性,它似乎总是有点偏色。

我见过一些回答如何设置selectedSegmentTintColor的问题,但我一直在努力将backgroundColor设置为.white,无论我做什么,它甚至总是显示出一点灰色尽管没有应用tintColor或类似设置。将backgroundColor设置为其他颜色可显示相同的行为,但用白色最为明显。更令人迷惑的是,虽然这种差异在iOS 13模拟器和运行iOS 13的物理设备上均会显示,但视觉调试器(在XCode 11 GM2中)并未显示出这种差异!

以下是几个屏幕快照,显示即使backgroundColorUISegmentedControl设置为与它后面显示的视图的backgroundColor相同,它们也略有不同。

运行iOS 13的设备(白色backgroundColor)enter image description here

Visual Debugger中显示的相同视图/代码(白色backgroundColor)enter image description here

运行iOS 13的设备(蓝色backgroundColor)enter image description here

我已经尝试过按照本SO帖子中的建议应用backgroundImage的建议:UISegmentedControl iOS 13 clear color,但最终将样式恢复为iOS 12中的外观,同时也会丢失漂亮的动画。

非常感谢任何指导或建议!我还向Apple提交了错误报告,请查看是否有任何错误。

ios swift uisegmentedcontrol ios13
1个回答
0
投票

将此扩展名用于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)
© www.soinside.com 2019 - 2024. All rights reserved.