Как размыть заголовок пользовательской кнопки, как заголовок системной UIButton, при касании в iOS?

#ios #swift #uibutton #custom-button

#iOS #swift #uibutton #пользовательская кнопка

Вопрос:

У меня есть следующая пользовательская кнопка:

 class GreenButton: UIButton {

override init(frame: CGRect) {
    super.init(frame: frame)
    setup()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    setup()
}

private func setup() {
    backgroundColor = .green
    layer.cornerRadius = 4
    setTitleColor(.white, for: .normal)
    titleLabel?.font = .systemFont(ofSize: 22, weight: .bold)
}
}
  

Но я хочу, чтобы ее заголовок размывался при касании, точно так же, как ведет себя system UIButton. Если я объявлю свою кнопку таким образом GreenButton(type: .system) , ее заголовок размывается, но шрифт не меняется. Если я объявлю его как GreenButton() , его шрифт будет в порядке, но заголовок не будет размытым. Как устранить проблему?

Ответ №1:

Установите другой цвет для выделенного состояния:

 private func setup() {
    backgroundColor = .green
    layer.cornerRadius = 4
    // set title normal color
    setTitleColor(.white, for: .normal)
    // set title highlighted color
    setTitleColor(.gray, for: .highlighted)
    titleLabel?.font = .systemFont(ofSize: 22, weight: .bold)
}
  

Ответ №2:

Вы также можете добиться этого, как показано ниже:

 class GreenButton: UIButton {

    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        setTitleColor(UIColor(white:1.0 , alpha: 0.5), for: .normal)
    }
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        setTitleColor(.white, for: .normal)
    }

    private func setup() {
        backgroundColor = .green
        layer.cornerRadius = 4
        setTitleColor(.white, for: .normal)
        titleLabel?.font = .systemFont(ofSize: 22, weight: .bold)
    }
}