【问题标题】:UIButton not toggling between two images Swift 4.2UIButton不在两个图像之间切换Swift 4.2
【发布时间】:2019-03-21 04:34:16
【问题描述】:

我想为我的应用添加声音。我添加了一个带有两个图像的 UIButton,soundON 和 soundOFF。 当我第一次在应用程序中调用声音设置时,它们会随着每张图像而正常切换。 但是,当我第二次及以后返回声音设置时,就像显示 soundOn 图像时 soundOff 图像并没有消失一样。 奇怪的是代码如此简短。

func soundButton() {
    sounds = UIButton(frame : CGRect(x: 65, y: 70, width: 40, height:40))
    sounds.setImage(UIImage(named : "soundON"), for : .normal)
    sounds.setImage(UIImage(named : "soundOFF"), for : .selected)
    sounds.showsTouchWhenHighlighted = true
    sounds.addTarget(self, action: #selector(soundButtonTapped), for: .touchUpInside)
    self.soundView.addSubview(sounds)
}

@objc func soundButtonTapped(_ sender: Any) {
    sounds.isSelected.toggle()
    isSoundOn.toggle()
}

我添加了一个视频来展示这个问题,因为这将节省大量的打字时间。

http://www.reeflifeapps.com/soundError.mov

非常感谢任何帮助。

更新: 我在拼图启动时隐藏了 UIView 上的按钮。当用户按下“声音设置”图标时,声音设置 UIView 被取消隐藏。我有这个功能上的按钮来取消隐藏声音设置。我将其移至 viewDidLoad() 并对其进行了修复。

【问题讨论】:

  • 你在哪里称呼这个soundButton()
  • 看起来 soundButton() 每次打开声音设置时都会被调用,所以当你第一次打开声音设置时它工作正常,但当你再次打开它时,它会向 soundView 添加新的声音按钮跨度>
  • 似乎每次显示系统声音视图时都会创建声音按钮。
  • 向我们展示切换方法以及调用 soundButton() 的位置? @anbu 的问题很好。
  • @Anbu,就是这样。我在拼图启动时隐藏了 UIView 上的按钮。当用户按下“声音设置”图标时,声音设置 UIView 被取消隐藏。我有这个功能上的按钮来取消隐藏声音设置。我将其移至 viewDidLoad() 并对其进行了修复。请把它作为答案,我会接受的。

标签: ios swift uibutton


【解决方案1】:

我建议您定义一个布尔变量来保持按钮的当前状态。然后,您应该根据变量的当前状态设置按钮的当前图像。

var isSoundOn = false

@objc func soundButtonTapped(_ sender: Any) {
    isSoundOn.toggle()
    if isSoundOn {
        // your logic when sound on (set button selected image, action etc)
    } else {
        // logic when sound off (set button not selected image, action etc)
    }
}

如果您仍想使用soundButton.isSelected 作为布尔变量,请不要soundButton.setImage(yourImage, for: .selected)soundButton.setImage(yourImage, for: .normal) 中定义不同状态的图像,并按如下方式定义它们:

soundButton.setImage(soundButton.isSelected ? soundOnImage : soundOffImage, for: .normal)

可以使用上述两种方法之一。

更新:

正如 Lloyd Kaijzer 所说,isSoundOn = !isSoundOn 更新为 isSoundOn.toggle()

【讨论】:

  • 在 swift 4.2 isSoundOn = !isSoundOn 可以替换为 isSoundOn.toggle()
  • .selected.normal 预设图像(一次)并用isSelected 更改它们是非常标准的做法。
  • 谢谢大家。我已经尝试了上述两种方法,结果相同。该按钮在 viewDidLoad() 中加载。图像仍然切换,但在彼此之上,而不是相互替换。这就是如此奇怪。 Swift 4.2,也许我需要在显示第二张图片之前删除一张图片?
  • 我知道这是一种众所周知的做法,但是我建议替换按钮的当前图像,因为@DavidSanford 说它覆盖了图像而不是替换它。您可能有另一个与您未在此处显示的代码相关的问题,因为我已经尝试过并且没有看到与上面的代码相同的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
  • 1970-01-01
  • 2013-05-24
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多