【问题标题】:How come music volume is not playing when my slider thumb is in the middle?当我的滑块拇指在中间时,为什么没有播放音乐音量?
【发布时间】:2016-04-24 18:09:04
【问题描述】:

我有这个 UISlider 来控制音乐播放的音量。当拇指在中间时,音乐的音量设置为 1 并且应该播放。我遇到的问题是它正在播放,但是一旦我将拇指向右或向左移动并尝试将拇指移回中间,我就听不到任何音乐了。当我向左或向右并为任一 AVPlayer 播放音乐时,它可以工作,除非滑块位于中间。提前谢谢!

    middleSlider = UISlider(frame: CGRectMake(110 * scaleFactor, 50, 300, 150))
    middleSlider.tintColor = UIColor.whiteColor()
    middleSlider.setThumbImage(UIImage(named: "thumb3"), forState: UIControlState.Normal)
    middleSlider.minimumTrackTintColor = UIColor.whiteColor()
    middleSlider.maximumTrackTintColor = UIColor.whiteColor()
    middleSlider.maximumValue = 2.0
    middleSlider.minimumValue =  0.0
    middleSlider.value = 1.0
    middleSlider.continuous = true
    middleSlider.userInteractionEnabled = false
    middleSlider.addTarget(self, action: #selector(middleSliderChangeAudio), forControlEvents: UIControlEvents.AllEvents)
    self.view?.addSubview(middleSlider)


    func middleSliderChangeAudio() {
    if middleSlider.value < 1.0 {

        player.volume = 1
        player2.volume = 0

    }

    if middleSlider.value > 1.0 {
        player.volume = 0
        player2.volume = 1
    }

    if middleSlider.value == 1.0 {
        player.volume = 1
        player2.volume = 1
}

  }

【问题讨论】:

  • 您确定将滑块正好设置在中间吗?使用断点或日志消息检查middleSlider.value 的值。正好是 1.0 吗?
  • 它在设置为 1 时开始工作。但是当我将滑块向右或向左移动并返回到中间时它不起作用。我尝试记录消息,但控制台中没有打印任何内容。
  • 即使您没有看到日志消息,您也可以随时设置断点并查看middleSlider.value。如果你能看到这些值,我认为这将是很明显的事情。调试器是你的朋友,学习如何使用它!

标签: ios swift avplayer uislider


【解决方案1】:

您的应用正在实现一个非常不友好的用户界面。您正在检查滑块的旋钮是否精确在中心。

即使在最好的情况下,任何人都很难做到这一点。用户必须点击一个像素。

此外,根据滑块的框架,用户可能会将旋钮放在那里,也可能不会,因为旋钮位置将被调整到最近的像素。可能不可能完全达到 1.0 —— 最近的可能位置可能略高于和低于 1.0。

您应该寻找 1.0 的某个阈值内的值,而不是准确地检查 1.0。

let threshold: Float = 0.05  // Experiment with this to see what feels best.
let lowerBoundary: Float = 1.0 - threshold
let upperBoundary: Float = 1.0 + threshold

if middleSlider.value < lowerBoundary {
    player.volume = 1
    player2.volume = 0
}
else if middleSlider.value <= upperBoundary {
    player.volume = 1
    player2.volume = 1
}
else /* must be middleSlider.value > upperBoundary */ {
    player.volume = 0
    player2.volume = 1
}

如果您想看到滑块“对齐”到中心,请在中间条件内调用middleSlider.value = 1.0

【讨论】:

  • 感谢您的帮助,但我收到一条错误消息,提示 Binary operator &lt; cannot be applied to operands of type Float and Double&lt;= 操作数相同。
  • 已编辑。您只需要告诉编译器对常量使用浮点数。没什么大不了的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
相关资源
最近更新 更多