【发布时间】:2017-02-07 16:12:01
【问题描述】:
我想在最初成功按下按钮后停止按下按钮一段时间。
我的第一个想法是使用计时器并禁用按钮一段时间,但我'我不确定如何实现这一点。
有人能指出我正确的方向吗?
我正在使用 swift。
【问题讨论】:
我想在最初成功按下按钮后停止按下按钮一段时间。
我的第一个想法是使用计时器并禁用按钮一段时间,但我'我不确定如何实现这一点。
有人能指出我正确的方向吗?
我正在使用 swift。
【问题讨论】:
如果您希望它应用于您应用中的所有按钮,您可以这样扩展 UIButton:
extension UIButton {
override open func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesEnded(touches, with: event)
self.isUserInteractionEnabled = false
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
self.isUserInteractionEnabled = true
}
}
}
如果您确实希望能够反复敲击按钮,您可以为这些特定按钮使用特定的扩展类,或者为所有具有@IBInspectable 类型为Bool 的按钮创建自定义扩展类设置特定按钮在按下后是否应暂时停用。
【讨论】:
我认为这个扩展很方便:
extension UIButton {
func preventRepeatedPresses(inNext seconds: Double = 1) {
self.isUserInteractionEnabled = false
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + seconds) {
self.isUserInteractionEnabled = true
}
}
}
@IBAction func pressedButton(_ sender: UIButton) {
sender.preventRepeatedPresses()
// do the job
}
【讨论】:
您不需要计时器,可以等待几秒钟然后再次激活按钮。
所以:
var ButtonIsActiv = false
func buttonPressed(button: UIButton) {
if ButtonIsActiv == false {
// do something with your button
ButtonIsActiv = true
// after 3 seconds, activate it again
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(3)) {
ButtonIsActiv = false
}
} else {
// your button is not activated
}
}
【讨论】:
这个怎么样?
//
// ViewController.swift
// SwiftButtonStopStackOverflow
//
// Created by Seoksoon Jang on 29/09/2016.
// Copyright © 2016 Seoksoon Jang. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
@IBOutlet var testButton: UIButton!
@IBAction func clickAction(_ sender: AnyObject) {
self.testButton.isEnabled = !self.testButton.isEnabled
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
self.testButton.isEnabled = !self.testButton.isEnabled
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
【讨论】:
不需要计时器。无需禁用。
点击按钮时,将当前日期存储在实例属性中。当再次点击按钮时,就在您将当前日期存储在同一个实例属性中之前,从新日期中减去旧日期。如果它们靠得太近,无论是什么,都不要执行按钮的操作。
换句话说,只有当两个时间戳相距足够远时,您才会采取行动。
这称为去抖动,是一种常见的技术。进行搜索,您会在这里找到很多关于它的讨论。
【讨论】:
你可以在你的控制器中有一个 Bool 来说明按钮是否可操作,当按下按钮时,设置 Bool,并安排一个 TimeInterval,如下所示:
Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(<YourMethod>), userInfo: nil, repeats: false)
另一种策略是在按下按钮后,禁用与属性 userInteractionEnabled 的交互,然后使用 Timer,再次启用该属性。
【讨论】: