【问题标题】:How to make a timer that starts with a long press on the button?如何制作一个长按按钮开始的计时器?
【发布时间】:2017-07-31 12:50:12
【问题描述】:

我目前正在学习 Swift 和 iOS 编程。我想制作一个从长按按钮开始的计时器。同时我想改变 UIButton 图像。我离开按钮,我希望按钮恢复原状。这可能吗?

【问题讨论】:

  • 友好建议:不要问这是否可能。去做吧。 您将通过实际操作来学习如何操作。 如果您在操作过程中遇到问题,阅读文档和调试后无法解决的问题,那么 Stack Overflow 是正确的地方问。如果你只是复制粘贴代码,你永远学不会。
  • 您应该首先尝试通过编写您认为可以解决的任何代码来解决您的问题,然后将其放在这里以供其他人帮助使其工作。如果不可能,您至少可以通过补充一些视觉表示来更详细地描述它。

标签: ios swift


【解决方案1】:

你绝对可以做到这一点。您必须添加 LongPressGestureRecognizer:

let longPress = UILongPressGestureRecognizer(target: self, action: #selector(yourAction))
button.addGestureRecognizer(longPress)

然后在你的函数中启动计时器并更改按钮的图像:

func yourAction(){
    Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(timerAction), userInfo: nil, repeats: false)
    button.setImage(UIImage(named: "yourImage"), for: .normal)
}


func timerAction(){
    //Do whatever you want
}

【讨论】:

  • 非常感谢!我会尝试编写代码,但我不知道写“你的行动”标题。我在项目上添加了按钮。这是错的吗? @Phyber
【解决方案2】:

您需要为此实施自己的解决方案,类似于

1- 用户触地(UIControlEvent touchDown),您开始一个每 x 秒/毫秒触发一次的时间

2- 计时器将一遍又一遍地触发动作

3- 用户触摸 UIControlEvent touchUp,你取消你的计时器

因此,您将这两个事件绑定到不同的函数,并通过适当的操作启动/终止您的计时器

这有什么帮助

我将添加一个代码进行演示:

@IBOutlet var button: UIButton!

var timer: Timer!
var speedAmmo = 100
@IBAction func buttonDown(sender: AnyObject) {
    singleFire()
    timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector:#selector(rapidFire), userInfo: nil, repeats: true)
}

@IBAction func buttonUp(sender: AnyObject) {
    timer.invalidate()
}

func singleFire() {
    if speedAmmo > 0 {
        speedAmmo -= 1
        print("bang!")
    } else {
        print("out of speed ammo, dude!")
        timer.invalidate()
    }
}

func rapidFire() {
    if speedAmmo > 0 {
        speedAmmo -= 1
        print("bang!")
    } else {
        print("out of speed ammo, dude!")
        timer.invalidate()
    }
}

override func viewDidLoad() {
    super.viewDidLoad()

    button.addTarget(self, action:#selector(buttonDown(sender:)), for: .touchDown)
    button.addTarget(self, action:#selector(buttonUp(sender:)), for: [.touchUpInside, .touchUpOutside])
}

请尝试告诉我!

【讨论】:

  • 是的,也许。但我不知道该怎么做@Bashir Sidani
  • 我为你更新了我的答案:) 只需打印沿途的计时器持续时间!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多