ios - Swift 2 - 定期从 slider 打印新值

标签 ios swift nstimer

我正在尝试定期打印 slider 中的值。但仅当该值与上次打印的值不同时才打印该值。我也不想错过 slider 的任何输出值。

为此,我创建了一个数组,并在该数组的开头添加了一个元素(如果该元素与开头已有的元素不同)。然后,我使用重复的 NSTimer 定期调用一个函数,该函数在将数组中的最后一个元素从数组中删除之前打印该函数。

当我运行应用程序时,会发生什么情况:NSTimer 在设定的时间内停止打印任何内容,但随后所有元素都会立即打印,并且每次打印不止一个。我尝试过摆弄很多不同的东西 - 这是我最接近让它发挥作用的。

如果您需要了解更多信息,请告诉我。

非常感谢您提供的任何帮助,非常感谢。

var sliderArray: [Float] = []
var timer: NSTimer!
let step: Float = 1

@IBAction func sliderValueChanged(sender: AnyObject) 
{
    let roundedValue = round(slider.value / step) * step
    slider.value = roundedValue

    if sliderArray.first != slider.value
    {
        sliderArray.insert(slider.value, atIndex: 0)
    }

    NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: #selector(sendSliderPosition), userInfo: nil, repeats: true)

}

func sendSliderPosition()
{
    if sliderArray.count > 0
    {
        print(self.sliderArray.last)
        sliderArray.removeLast()
    }

}

最佳答案

我建议使用 CADisplayLink。 CADisplayLink 对象是一个计时器对象,它允许应用程序将其绘图与显示器的刷新率同步。这非常适合您的滑盖盒。

当 slider 或 UI 处于静止状态时,这也不会触发不必要的调用。

class C: UIViewController {

    var displayLinkTimer: CADisplayLink?
    @IBOutlet weak var slider: UISlider!

    override func viewDidLoad() {
        super.viewDidLoad()
        displayLinkTimer = CADisplayLink(target: self, selector: #selector(printSliderValue))
        let runLoop = NSRunLoop.mainRunLoop()
        displayLinkTimer?.addToRunLoop(runLoop, forMode: runLoop.currentMode ?? NSDefaultRunLoopMode )
        displayLinkTimer?.paused = true
    }

    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)
        displayLinkTimer?.paused = true
    }

    deinit {
        displayLinkTimer?.invalidate()
    }



    func printSliderValue()
    {
        let step: Float = 1
        let roundedValue = round(slider.value / step) * step
        slider.value = roundedValue
        print(roundedValue)
    }


}

基本思想是这样的:

--> 每当屏幕需要重绘时(考虑到这是 fps 速率,这将以每秒最多 60 帧的速度发生),我们就有机会执行函数。

--> 为此,我们将 displayLink 添加到运行循环中。 (运行lopp处理输入/刷新UI和时间片)

--> 注意 如果屏幕上不需要重绘,则不会调用此方法。这并不是一个定期触发的计时器。当需要重画时它会被触发。在 slider 的情况下,我们希望当我们移动 slider 时也能触发它。

有关其实际工作原理的更多信息,请尝试一下并参阅苹果文档。确保在取消初始化 ViewController 之前使其无效。

关于ios - Swift 2 - 定期从 slider 打印新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39416850/

相关文章:

ios - 最小按钮间距

ios - 当我缩放 GMaps 自定义标记 View 时更改位置

ios - 无法识别的选择器发送到实例 NSTimer Swift

ios - 从详细信息转入后更新 TableView 数据

ios - iPhone编程,加载plist数据,访问它

swift - 如何将 CocoaImageHashing pod 与 Swift 项目链接(dyld : Library not loaded)

ios - 无法为类型 'SCNMatrix4' 调用初始值设定项

objective-c - 根据 NSTimer 更新 UILabel

ios - 按钮未改变位置

ios - 与 Apple Watch 配对后,远程通知声音还能在 iPhone 上播放吗?