【问题标题】:How to create an effect to highlight correct answer如何创建突出正确答案的效果
【发布时间】:2021-03-11 23:20:16
【问题描述】:

我正在学习 Swift,并且我正在将自己投入到深层次来强迫自己学习这门语言。我有一个小侄子,他想制作一个应用程序来帮助他学习数字。

该应用程序旨在在屏幕上设置一组按钮,如下所示。我有播放方向的代码,它告诉用户选择哪个号码。音频文件 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()
    }
    
    
}

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

【问题讨论】:

  • 您发布的代码似乎与您提出的问题没有任何关系。您不应该发布生成数字按钮的代码以及点击按钮时触发的 IBActions 吗?你不应该解释一下“方向”是什么意思吗?该应用程序是否具有预先录制的声音,可以告诉您侄子要点击哪个号码或其他内容?
  • 我所拥有的代码没有任何尝试去做什么,因为我真的不知道该做什么。至于其他 cmets,我已经编辑了我的帖子以使其更加清晰;我不知道这令人困惑,对此我深表歉意

标签: swift xcode button highlight


【解决方案1】:

我会这样做:

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

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

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

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

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

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 { buttonArray[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
                       })
    }
}

【讨论】:

  • 请看我答案末尾的动画代码。您甚至可能想下载示例项目并尝试一下。
  • 非常感谢。示例项目非常完美,因为我实际上可以看到代码的作用。我编辑了我的问题,它说 A-N14a 音频说选择数字 4。我将如何将您编写的代码设置为仅针对选择按钮执行此操作?
  • 编辑-我更改了buttonsArray.randomElement()!成为按钮A,它只为按钮A设置动画;我不知道你是否会看到这个,但如果你看到了,请告诉我这是正确的方法还是有其他方法?我还想学习如何正确编码,而不是蛮力完成所有事情。
  • 我建议将动画代码提取到函数animateButton(atIndex:) 中传递您想要动画的按钮的索引。首先,用一个常数索引来调用它。稍后,当您更新应用程序以告诉您的侄子按下各种按钮时,您的功能将支持该功能而无需更改。
  • 看看我回答的第一部分。我概述了一个相当完整的方法来开发一个真正选择随机数并教人们识别他们的数字的应用程序。
【解决方案2】:

我会这样做:

1.创建与您的数字一样多的 IBOutlets(我想您的示例是 0-9?)并将它们链接到您的按钮 - 例如

@IBOutlet weak var Button1: UIButton!

@IBOutlet weak var Button2: UIButton!

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

2。使用此代码创建一个 IBAction 并将其链接到您的所有按钮

@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 }

      }

   }

}

享受吧!

【讨论】:

  • 这只是一个尝试顺便说一句 - 因为正如上面评论你的代码没有反映你的问题。如果可以的话,很乐意提供更多帮助。
  • 非常感谢。这基本上就是我想要的。当我执行“sender.backgroundColor = .red”时,我确实有一个问题。我希望发件人是用户自动选择的任何按钮。我如何检索该信息?同样在“如果 i.titleLabel?.text == "YOUR CORRECT ANSWER" { i.backgroundColor = .orange }" 行中,什么是 "titleLabel?",它是正确按钮的名称吗?
  • 如果您将所有按钮链接到 IBAction(我的意思是,所有按钮都链接到同一个 IBAction),“sender”是代表您正在按下的按钮的参数。因此,它是用户自动选择的。 titleLabel 是按钮的一个属性,它携带写在按钮上的文本。我把它想象成一种计算器,每个按钮上都有一个标签,上面写着“1”、“2”、“3”、..
猜你喜欢
  • 2015-09-06
  • 1970-01-01
  • 2023-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多