如何创建突出显示正确答案的效果

How to create an effect to highlight correct answer

我正在学习Swift,我正在把自己投入深渊,强迫自己学习语言。我有一个小侄子,他想做一个应用程序来帮助他学习数字。

该应用旨在在屏幕上设置一定数量的按钮,如下所示。我有播放 Directions 的代码,它告诉用户要 select 的号码。音频文件 A-N14a 说要单击 4。完成按钮设置为移动到下一个屏幕。

我想问的是,如果我要按4,而他们按9,我想知道如何实现一个功能来提示点击数字4?想法是将背景更改为按钮,但我不知道如何实现该功能。我也对其他想法持开放态度。请注意,我不知道该怎么做,而且我正在努力学习,所以提供的代码可能非常简单并且处于起步阶段。

下面是屏幕图像和该页面的代码。

ScreenShot of Page

import UIKit
import AVFoundation

class Intervention_Numerals1: UIViewController {


    @IBOutlet weak var Directions: UIButton!
    @IBOutlet weak var Done: UIButton!
    var audioPlayer = AVAudioPlayer()

    
    override func viewDidLoad() {
        super.viewDidLoad()
        setUpElements()
        //Audio Test
        do {
            audioPlayer = try AVAudioPlayer(contentsOf: URL.init(fileURLWithPath: Bundle.main.path(forResource: "A-N14a", ofType:"mp3")!))
            audioPlayer.prepareToPlay()
        } catch {
            print(error)
        }
    }
    
    func setUpElements() {
        // Style the elements
        Utilities.styleFilledButton(Directions)
        Utilities.styleFilledButton(Done)
    }

    @IBAction func Play(_ sender: Any) {
        audioPlayer.play()
    }
    
    
}

请让我知道任何提示或建议或类似问题的链接,即使我自己找不到。

我会这样做:

1.创建与您的数字一样多的 IBOutlets(我假设您的示例为 0-9?)并将它们 link 添加到您的按钮 - 例如

@IBOutlet weak var Button1: UIButton!

@IBOutlet weak var Button2: UIButton!

// Create as many as you need - Probably 10?

2。使用此代码

创建一个 IBAction 并 link 它到您所有的按钮
@IBAction func checkCorrectAnswer(_ sender: UIButton) {
      
   let arrayOfButtons:[UIButton] = [Button1, Button2] // Here you add all your buttons

   let buttonTitle = sender.title(for: .normal)!

   if buttonTitle == "YOUR CORRECT ANSWER" {   //You have to substitute "YOUR CORRECT ANSWER" with the right string value

      sender.backgroundColor = .green

   } else {

      sender.backgroundColor = .red

      for i in arrayOfButtons {

         if i.titleLabel?.text == "YOUR CORRECT ANSWER" { i.backgroundColor = .orange }

      }

   }

}

尽情享受吧!

我会这样做:

录制“点击数字”的声音,然后录制数字 0 到 9 的声音。将数字声音命名为“0.mp3”到“9.mp3”

创建一个带有 4 个按钮的故事板(如您发布的图片。)

设置按钮 IBOutlets buttonA - buttonD。将这些按钮放入一个数组中:

let buttonsArray = [buttonA, buttonB, buttonC, buttonD]

用数字 0-9 填充一个数组。洗牌。删除 4 个值,将它们放入数组“buttonValues”(使用方法 removeLast()。)从 0-9 生成 non-repeating 值的代码可能如下所示:

var randomNumbers =  [Int]() //Define an array to hold random Ints
var lastValueReturned: Int?

//Function to return a random Int. It won't return the same value twice
func randomNumber() -> Int {


    //Remove and return an item from the array
    var result: Int
    repeat {
        //If the array is empty, fill it with the shuffled numbers 0...9
        if randomNumbers.isEmpty {
            randomNumbers += Array(0...9).shuffled()
        }
        result = randomNumbers.removeLast()
    } while result == lastValueReturned
    lastValueReturned = result
    return result
}

遍历 buttonValues 数组并将每个数字的字符串安装为其中一个按钮的标题:

对于索引 = 0...3 { buttonsArray[index].setTitle("(buttonValues[index])", forSate: .normal) }

选择索引 0-3 作为“正确”数字。

let indexToPick = Int.random(in: 0...3)

在 buttonValues 中查找该值,并使用它来选择要播放的声音文件:

let numberToPick = buttonValues[indexToPick]

let soundName = "\(numberToPick).mp3"

加载并播放“点击数字”声音,然后加载并播放所选数字(soundName)的声音。

当用户点击按钮时,让 IBAction 方法使用传递给它的 sender 参数,并查看按钮数组 buttonsArray 以查看点击了哪个按钮索引。

如果是正确的按钮,则执行成功操作。

如果点击的按钮索引不是 indexToPick,请制作一个动画来更改按钮在 indexToPick 处的背景颜色或按钮的边框宽度等,然后再将其动画化到正常。 (查看 UIView animate(duration:) 系列方法,了解如何为按钮的背景颜色设置动画。使用带有 options: 参数的表单,并设置 .autoreverse 选项。)

如果您是 iOS 开发的新手,弄清楚如何为您的正确答案按钮制作动画可能是一个挑战。我创建了一个示例项目,它只为 4 个随机按钮之一设置动画:https://github.com/DuncanMC/ButtonAnimation.git

该项目的代码如下:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var buttonA: UIButton!
    @IBOutlet weak var buttonB: UIButton!
    @IBOutlet weak var buttonC: UIButton!
    @IBOutlet weak var buttonD: UIButton!

    //Define an empty array to hold buttons.
    var buttonsArray = [UIButton]()

    override func viewDidLoad() {
        super.viewDidLoad()

        //Put our button outlets into an array so we can reference them by index.
        buttonsArray = [buttonA, buttonB, buttonC, buttonD]

        //Give our buttons a cornerRadius so they look rounded when we add a border and fill color
        for button in buttonsArray {
            button.layer.cornerRadius = 10
        }
    }

    @IBAction func handleAnimateButton(_ sender: UIButton) {
        sender.isEnabled = false

        //Pick a random button
        let button = buttonsArray.randomElement()!

        //Create an auto-reversing animation that fills the button with cyan, and draws a border around it.
        //(Showing the border won't fade in and out, but it doesn't really matter)
        UIView.animate(withDuration: 0.25,
                       delay: 0,
                       options: [.autoreverse, .curveEaseInOut],
                       animations: {
                        button.backgroundColor = .cyan
                        button.layer.borderWidth = 1.0
                       }, completion: {
                        success in
                        button.backgroundColor = .clear
                        sender.isEnabled = true
                        button.layer.borderWidth = 0
                       })
    }
}