使用动画显示颜色顺序(Swift)
Use animations to show color sequence (Swift)
您好,我是 Swift 的新手,我想为 IPhone 创建一个颜色记忆游戏,您的应用程序会为您提供一系列颜色,您必须按右纽扣。每次按下前一个序列的右侧按钮时,序列就会变得越来越长。
我希望应用程序通过在按钮上使用动画来显示按下了哪个按钮。该序列将使按钮闪烁,然后用户可以重新创建序列。
我有一个执行 flash() 的方法,它是 class 的一部分,它是 UIButton
的扩展
func flash() {
let flash = CABasicAnimation(keyPath: "opacity")
flash.duration = 0.2
flash.fromValue = 1
flash.toValue = 0.1
flash.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
flash.autoreverses = true
flash.repeatCount = 1
layer.add(flash, forKey: nil)
}
当我对一系列按钮执行此方法时,它会同时闪烁写入该序列的所有按钮。这当然不是我想要的方式,我希望按钮一个接一个地闪烁。
// ViewController.swift
import UIKit
import SpriteKit
class GameViewController: UIViewController {
var colorPattern = [Int]()
@IBOutlet weak var buttonGreen: UIButton!
@IBOutlet weak var buttonRed: UIButton!
@IBOutlet weak var buttonBlue: UIButton!
@IBOutlet weak var buttonYellow: UIButton!
var buttons = [UIButton]()
override func viewDidLoad() {
super.viewDidLoad()
buttons = [buttonGreen, buttonRed, buttonBlue, buttonYellow]
colorPattern = [0, 1, 2, 0, 1, 2]
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBAction func colorButtonTouched(_ sender: UIButton) {
print("button touched: ", sender.titleLabel!.text!)
//sender.flash()
doPattern()
}
func doPattern() {
UIView.animateKeyframes(withDuration: 1, delay: 0, options: [.calculationModeCubic], animations: {
// Add animations
for index in self.colorPattern{
print(index);
UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 1, animations: self.buttons[index].flash)
}
}, completion:{ _ in
print("I'm done!")
})
}
}
当我执行此代码时,按钮 1、2 和 3 同时闪烁。有没有办法来解决这个问题?或者动画不是循环序列的正确方法。
试试这个
var currentButtonIndex = 0
func doPattern()
{
let currentButton = self.buttons[self.currentButtonIndex]
UIView.animateKeyframes(withDuration: 1, delay: 0, options: [.autoreverse], animations: {
currentButton.alpha = 0
}) { (complete) in
currentButton.alpha = 1
if self.currentButtonIndex == self.buttons.count - 1
{
self.currentButtonIndex = 0
return
}
self.currentButtonIndex += 1
self.doPattern()
}
}
您好,我是 Swift 的新手,我想为 IPhone 创建一个颜色记忆游戏,您的应用程序会为您提供一系列颜色,您必须按右纽扣。每次按下前一个序列的右侧按钮时,序列就会变得越来越长。
我希望应用程序通过在按钮上使用动画来显示按下了哪个按钮。该序列将使按钮闪烁,然后用户可以重新创建序列。
我有一个执行 flash() 的方法,它是 class 的一部分,它是 UIButton
的扩展 func flash() {
let flash = CABasicAnimation(keyPath: "opacity")
flash.duration = 0.2
flash.fromValue = 1
flash.toValue = 0.1
flash.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
flash.autoreverses = true
flash.repeatCount = 1
layer.add(flash, forKey: nil)
}
当我对一系列按钮执行此方法时,它会同时闪烁写入该序列的所有按钮。这当然不是我想要的方式,我希望按钮一个接一个地闪烁。
// ViewController.swift
import UIKit
import SpriteKit
class GameViewController: UIViewController {
var colorPattern = [Int]()
@IBOutlet weak var buttonGreen: UIButton!
@IBOutlet weak var buttonRed: UIButton!
@IBOutlet weak var buttonBlue: UIButton!
@IBOutlet weak var buttonYellow: UIButton!
var buttons = [UIButton]()
override func viewDidLoad() {
super.viewDidLoad()
buttons = [buttonGreen, buttonRed, buttonBlue, buttonYellow]
colorPattern = [0, 1, 2, 0, 1, 2]
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBAction func colorButtonTouched(_ sender: UIButton) {
print("button touched: ", sender.titleLabel!.text!)
//sender.flash()
doPattern()
}
func doPattern() {
UIView.animateKeyframes(withDuration: 1, delay: 0, options: [.calculationModeCubic], animations: {
// Add animations
for index in self.colorPattern{
print(index);
UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 1, animations: self.buttons[index].flash)
}
}, completion:{ _ in
print("I'm done!")
})
}
}
当我执行此代码时,按钮 1、2 和 3 同时闪烁。有没有办法来解决这个问题?或者动画不是循环序列的正确方法。
试试这个
var currentButtonIndex = 0
func doPattern()
{
let currentButton = self.buttons[self.currentButtonIndex]
UIView.animateKeyframes(withDuration: 1, delay: 0, options: [.autoreverse], animations: {
currentButton.alpha = 0
}) { (complete) in
currentButton.alpha = 1
if self.currentButtonIndex == self.buttons.count - 1
{
self.currentButtonIndex = 0
return
}
self.currentButtonIndex += 1
self.doPattern()
}
}