Добавьте цветовую реакцию на UIButton при нажатии или наведении пальцем - PullRequest
0 голосов
/ 29 октября 2019

Я создаю настраиваемое представление предупреждений в swift, потому что дизайн, который я хочу, отличается, в любом случае все работает отлично, но добавленные мной кнопки не распознаются при нажатии, без изменения фона, ничего. Когда я щелкаю по одному из них, я хочу, чтобы фон стал серым, как в других быстрых оповещениях (стандартных) или когда я держу палец над ними.

Вот код:

let window = UIApplication.shared.keyWindow!
        self.alertPopUp10.tag = 31
        self.alertPopUp10.frame.origin.x = 0
        self.alertPopUp10.frame.origin.y = 0
        self.alertPopUp10.frame.size.width = window.bounds.width
        self.alertPopUp10.frame.size.height = window.bounds.height

        let blurEffect = UIBlurEffect(style: UIBlurEffect.Style.dark)
        let blurEffectView = UIVisualEffectView(effect: blurEffect)
        blurEffectView.tag = 121212
        blurEffectView.frame = self.alertPopUp10.bounds

        let cardView = UIView()
        blurEffectView.contentView.addSubview(cardView)

        cardView.translatesAutoresizingMaskIntoConstraints = false
        cardView.frame.size.width = 250
        cardView.frame.size.height = 121
        cardView.tag = 76859
        cardView.frame.origin.x = (self.alertPopUp10.bounds.width / 2) - (cardView.frame.width / 2)
        cardView.frame.origin.y = (self.alertPopUp10.bounds.height / 2) - (cardView.frame.height / 2)

        cardView.backgroundColor = .white
        cardView.layer.cornerRadius = CGFloat(15.0)
        cardView.clipsToBounds = true

        let title = UILabel()
        title.text = "Die Session läuft in 2 Minuten ab, soll sie verlängert werden?"
        title.textAlignment = .center
        title.layoutMargins = UIEdgeInsets(top: 30, left: 5, bottom: 5, right: 5)
        title.frame.size.width = 250
        title.frame.size.height = 70
        title.frame.origin.y = 0
        title.font = .systemFont(ofSize: 15.0)
        title.frame.origin.x = (cardView.bounds.width / 2) - (title.frame.width / 2)
        title.numberOfLines = 2
        title.textAlignment = .center
        cardView.addSubview(title)

        let horizontalLine = UIView(frame: CGRect(x: 0, y: title.frame.maxY, width: cardView.frame.width, height: 1))
        horizontalLine.backgroundColor = .lightGray
        cardView.addSubview(horizontalLine)

        let vertLine = UIView()
        vertLine.frame.size.width = 1
        vertLine.frame.origin.x = (cardView.bounds.width / 2) - (vertLine.frame.width / 2)
        vertLine.frame.origin.y = horizontalLine.frame.maxY
        vertLine.frame.size.height = 50
        vertLine.backgroundColor = .lightGray
        vertLine.translatesAutoresizingMaskIntoConstraints = false
        cardView.addSubview(vertLine)

        let yes = UIButton()
        yes.setTitle("JA", for: .normal)
        yes.tag = 54362
        yes.setTitleColor(UIColor(named: "default"), for: .normal)
        yes.addTarget(self, action: #selector(self.resetToken(_:)), for: .touchUpInside)
        yes.frame.size.width = 124
        yes.frame.size.height = 50
        yes.frame.origin.x = 0
        yes.titleLabel?.font = .boldSystemFont(ofSize: 15.0)
        yes.frame.origin.y = horizontalLine.frame.maxY
        cardView.addSubview(yes)

        let no = UIButton()
        no.setTitle("NEIN", for: .normal)
        no.tag = 45234
        no.setTitleColor(UIColor(named: "default"), for: .normal)
        no.addTarget(self, action: #selector(self.dismissAlert(_:)), for: .touchUpInside)
        no.frame.size.width = 124
        no.frame.size.height = 50
        no.titleLabel?.font = .boldSystemFont(ofSize: 15.0)
        no.frame.origin.x = vertLine.frame.maxX
        no.frame.origin.y = horizontalLine.frame.maxY
        cardView.addSubview(no)

        self.alertPopUp10.addSubview(blurEffectView)

Ответы [ 2 ]

1 голос
/ 29 октября 2019

Таким образом, у вас есть два варианта сделать кнопку динамической:

Первый более простой вариант - инициализировать кнопку как системную кнопку.

Например:

let button = UIButton(type: .system)

Кнопка автоматически получит эффекты при нажатии.

Второй параметр, который более настраиваемый.

Изменение цвета заголовка при выделении кнопки:

let button = UIButton()
button.setTitleColor(.yourColor, for: .highlighted)

Изменение цвета кнопки при выделении можно осуществить с помощью переопределения свойства isHidden UIButton:

class UIButton {
    override open var isHighlighted: Bool {
        didSet {
            let normalColor = .yourColor
            let highlightedColor = .yourColor
            self.backgroundColor = isHighlighted ? highlightedColor : normalColor
        }
    }
}

Но помните, что это повлияет на все кнопки UIB, которые вы создадите. Если вы хотите использовать только определенную кнопку, то лучше создать пользовательскую кнопку UIButton.

0 голосов
/ 29 октября 2019

Изменение фона при нажатии легко, если вы используете фоновое изображение для кнопки, а не простой цвет фона. Вы можете использовать расширение на UIColour, чтобы легко создать цветное фоновое изображение для кнопки.

extension UIColor {
    func image(_ size: CGSize = CGSize(width: 1, height: 1)) -> UIImage {
        return UIGraphicsImageRenderer(size: size).image { rendererContext in
            self.setFill()
            rendererContext.fill(CGRect(origin: .zero, size: size))
        }
    }
}

, а затем просто создать изображение для нормального и выбранного состояния, назначить кнопкам два состояния, и оно будетизменить при нажатии

let normalImage = UIColor.blue.image()
let selectedImage = UIColor.purple.image()
button.setBackgroundImage(normalImage, for: .normal)
button.setBackgroundImage(selectedImage, for: .highlighted)

Если это то, что вы хотите делать регулярно, вы даже можете расширить UIButton, чтобы сделать его еще проще

extension UIButton {
   func setBackroundColor(_ color: UIColor, for state: UIControl.State) {
      self.setBackgroundImage(color.image(), for: state)
   }
}

и использовать его как

button.setBackroundColor(.darkGray, for: .normal)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...