как изменить стиль для 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.

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

2 11

2 ответа:

Аналогично тому, как вы уже установили фоновое изображение для 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)
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)