首页 > 解决方案 > UIButton 有时仅在按下时才响应

问题描述

我一直在开发一个应用程序,以前从未遇到过这样的问题。在我的大部分开发时间里,直到最后,我也没有遇到这个问题。我开始认为这是因为我添加到视图控制器中的一些东西使按钮有时只响应。这是我的整个 ViewController,每次都不触发的方法在底部。

class StartViewController: UIViewController {

var timer: Timer?
var timer2: Timer?

let header: UILabel = {
    let label = UILabel()
    label.text = ""
    label.font = UIFont.customBoldFont(size: 40)
    label.textColor = UIColor.textColor()
    return label
}()

let cursor: UIView = {
    let view = UIView()
    view.backgroundColor = UIColor.textColor()
    return view
}()

let startButton: UIButton = {
    let button = UIButton()
    button.setTitle("Start", for: .normal)
    button.setTitleColor(.white, for: .normal)
    button.backgroundColor = UIColor.appColor()
    button.addTarget(self, action: #selector(start), for: .touchUpInside)
    button.isUserInteractionEnabled = true
    button.isEnabled = true
    button.isMultipleTouchEnabled = true
    return button
}()

let epmLabel: UILabel = {
    let label = UILabel()
    label.text = "EPM"
    label.font = UIFont.customBoldFont(size: 25)
    label.textColor = UIColor.textColor()
    return label
}()

let epmValue: UILabel = {
    let label = UILabel()
    label.text = ""
    label.font = UIFont.customFont(size: 20)
    label.textColor = UIColor.textColor()
    return label
}()

let accuracyLabel: UILabel = {
    let label = UILabel()
    label.text = "Accuracy"
    label.font = UIFont.customBoldFont(size: 25)
    label.textColor = UIColor.textColor()
    return label
}()

let accuracyValue: UILabel = {
    let label = UILabel()
    label.text = ""
    label.font = UIFont.customFont(size: 20)
    label.textColor = UIColor.textColor()
    return label
}()

override func viewDidLoad() {
    super.viewDidLoad()
    create()
    getStats()
    animateHeader()
}

func create() {
    view.backgroundColor = UIColor.backgroundColor()
    view.isUserInteractionEnabled = true

    let titleView = UIView()
    view.addSubview(titleView)
    titleView.anchor(top: view.topAnchor, left: view.leftAnchor, bottom: view.centerYAnchor, right: view.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 0)

    view.addSubview(header)
    header.translatesAutoresizingMaskIntoConstraints = false
    header.centerYAnchor.constraint(equalTo: titleView.centerYAnchor).isActive = true
    header.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    header.addSubview(cursor)
    cursor.anchor(top: header.topAnchor, left: nil, bottom: header.bottomAnchor, right: header.rightAnchor, paddingTop: 3, paddingLeft: 0, paddingBottom: -3, paddingRight: -7, width: 2, height: 0)
    cursor.layer.cornerRadius = 1

    view.addSubview(startButton)
    startButton.translatesAutoresizingMaskIntoConstraints = false
    startButton.constrainSize(width: 300, height: 60)
    startButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    startButton.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    startButton.layer.cornerRadius = 30

    let statsView = UIView()
    view.addSubview(statsView)
    statsView.anchor(top: view.centerYAnchor, left: view.leftAnchor, bottom: view.bottomAnchor, right: view.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 0)

    let epmStack = UIStackView(arrangedSubviews: [epmLabel, epmValue])
    epmStack.axis = .vertical
    epmStack.alignment = .center
    epmStack.spacing = 5
    view.addSubview(epmStack)
    epmStack.anchor(top: nil, left: startButton.leftAnchor, bottom: nil, right: startButton.centerXAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 0)
    epmStack.centerYAnchor.constraint(equalTo: statsView.centerYAnchor).isActive = true

    let accuracyStack = UIStackView(arrangedSubviews: [accuracyLabel, accuracyValue])
    accuracyStack.axis = .vertical
    accuracyStack.alignment = .center
    accuracyStack.spacing = 5
    view.addSubview(accuracyStack)
    accuracyStack.anchor(top: nil, left: startButton.centerXAnchor, bottom: nil, right: startButton.rightAnchor, paddingTop: 30, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 0)
    accuracyStack.centerYAnchor.constraint(equalTo: statsView.centerYAnchor).isActive = true
}

func getStats() {
    let defaults = UserDefaults.standard
    let epm = defaults.integer(forKey: "epm")
    let accuracy = defaults.double(forKey: "accuracy")
    //Check if first load
    if(accuracy == -1.0 && epm == -1) {
        epmValue.text = "0"
        accuracyValue.text = "0%"
    } else {
        epmValue.text = String(describing: epm)
        accuracyValue.text = String(describing: accuracy) + "%"
    }
    if(accuracy >= 70.0) { accuracyValue.textColor = UIColor.rgb(red: 34, green: 181, blue: 98) }
    if(accuracy < 70.0 && accuracy > 30.0) { accuracyValue.textColor = UIColor.rgb(red: 255, green: 241, blue: 117) }
    if(accuracy <= 30.0) { accuracyValue.textColor = UIColor.rgb(red: 242, green: 107, blue: 90) }
}

func animateHeader() {
    let str = ["E","m","o","j","i"," ","T","y","p","e", " "]
    var i = 0
    timer = Timer.scheduledTimer(withTimeInterval: 0.2, repeats: true) { (timer) in
        if(i == str.count - 1) {
            self.cursor.alpha = 0
            self.header.text?.append(str[i])
            i+=1
        }
        if(i >= str.count) {
            self.timer?.invalidate()
            self.animateEmojis()
        } else {
            self.header.text?.append(str[i])
            i+=1
        }
    }
}

func animateEmojis() {
    var emojiOptions = ["","","","","","","☀️","⚽️","","","","","","","","","","","","",""]
    emojiOptions.shuffle()
    var i = 0
    var counter = 0
    timer2 = Timer.scheduledTimer(withTimeInterval: 1.25, repeats: true) { (timer) in
        if(i >= emojiOptions.count) { i = 0 }
        if(counter >= 100) {
            self.timer2?.invalidate()
        } else {
            self.header.text?.removeLast()
            self.header.text?.append(emojiOptions[i])
        }
        i+=1
        counter+=1
    }
}

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    self.view.setNeedsUpdateConstraints()
}

@objc func start() {
    print("Activated")
    timer?.invalidate()
    timer2?.invalidate()
    let mainVC = UINavigationController(rootViewController: MainViewController())
    self.present(mainVC, animated: true, completion: nil)
}
}

我有一个打印语句,用于检查按钮何时被单击,并且仅在事件发生时打印(不是每次我尝试单击它时)。我一生都无法弄清楚为什么现在会发生这种情况。

标签: swiftuibuttonuikit

解决方案


推荐阅读