UIButton不在两个图像之间切换Swift 4.2

Posted

技术标签:

【中文标题】UIButton不在两个图像之间切换Swift 4.2【英文标题】:UIButton not toggling between two images 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() 并对其进行了修复。请把它作为答案,我会接受的。 【参考方案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 说它覆盖了图像而不是替换它。您可能有另一个与您未在此处显示的代码相关的问题,因为我已经尝试过并且没有看到与上面的代码相同的问题。

以上是关于UIButton不在两个图像之间切换Swift 4.2的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中的图像之间切换?

UIButton 选择状态的图像出现在正常状态的图像后面

可重复使用的表格视图单元格中的 UIButton 图像切换问题

IOS/Swift:检查按钮图像以切换按钮图像

Swift:使用 tableView DidSelect 方法更改单元格的 UIButton 图像

在GameScene和ViewController Swift之间移动