Как изменить стиль для UISegmentedControl, когда он выбран пользователем в Swift?

Это мой UISegmentedControl, написанный в Swift:

введите описание изображения здесь

Я создал его со следующим кодом:

let selectedAttributes: NSDictionary = [
        NSForegroundColorAttributeName: UIColor.black,
        NSFontAttributeName: fontForSegmentedControl!
    ]

    let normalAttributes: NSDictionary = [
        NSForegroundColorAttributeName: UIColor.gray,
        NSFontAttributeName: fontForSegmentedControl!
    ]

    mySegmentedControl.setTitleTextAttributes(selectedAttributes as [NSObject : AnyObject], for: UIControlState.selected)

    mySegmentedControl.setTitleTextAttributes(normalAttributes as [NSObject : AnyObject], for: UIControlState.normal)

и расширение для удаления границ находится здесь:

extension UISegmentedControl {
    func removeBorders() {
        setBackgroundImage(imageWithColor(color: UIColor.white/*backgroundColor!*/), for: .normal, barMetrics: .default)
        setBackgroundImage(imageWithColor(color: tintColor!), for: .selected, barMetrics: .default)
        setDividerImage(imageWithColor(color: UIColor.clear), forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default)
    }

    // create a 1x1 image with this color
    private func imageWithColor(color: UIColor) -> UIImage {
        let rect = CGRect(x: 0.0, y: 0.0, width:  1.0, height: 1.0)
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()
        context!.setFillColor(color.cgColor);
        context!.fill(rect);
        let image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return image!
    }
}

Но с этим что-то не так.

Когда я нажимаю (и удерживаю) ONE или TWO, он меняет цвет фона на это (на время его касания пальцем пользователя):

введите описание изображения здесь

Мне не хватает кода для изменения стиля для выбранного (временно нажатого) параметра в UISegmentedControl.

Как удалить оттенок темно-серого цвета и оставить его четким цветом?

Ответ 1

Аналогично тому, как вы уже установили фоновое изображение для UIControlState.normal, вам нужно установить соответствующие изображения для UIControlState.highlighted и UIControlState.selected + UIControlState.highlighted.

Добавьте следующий код к вашей функции расширения removeBorders() (при условии, что вы хотите иметь четкий фон для нажатого не выбранного сегмента и оттенка цветного фона для выбранного выбранного):

setBackgroundImage(imageWithColor(color: .clear), for: .highlighted, barMetrics: .default)
setBackgroundImage(imageWithColor(color: tintColor!), for: [.selected, .highlighted], barMetrics: .default)

Ответ 2

let normalAttributes: NSDictionary = [
    NSForegroundColorAttributeName: UIColor.gray,
    NSFontAttributeName: fontForSegmentedControl!
]

mySegmentedControl.setTitleTextAttributes(selectedAttributes as [NSObject : AnyObject], for: UIControlState.selected)

Приведенный выше код добавляет только серый цвет для выбора, поэтому измените его как ниже

let normalAttributes: NSDictionary = [
    NSForegroundColorAttributeName: UIColor.white,
    NSFontAttributeName: fontForSegmentedControl!
]

mySegmentedControl.setTitleTextAttributes(selectedAttributes as [NSObject : AnyObject], for: UIControlState.selected)