使用按钮更改背景图片

时间:2018-07-18 06:51:57

标签: swift xcode cocoa

我正在尝试使应用程序起作用,以便当用户按下其中一幅图像(即按钮)时,背景将发生变化。我的问题是,当按下按钮时,背景不会更改为图片。我一直在寻找答案,但一无所获。有人能帮忙吗? https://i.stack.imgur.com/boEiZ.png <-图片已在此处链接,因为堆栈溢出不允许我嵌入图片。

@IBOutlet weak var background: NSImageView!

let grass = NSImage(named :NSImage.Name(rawValue: "wetgrass"))

override func viewDidLoad() {
    super.viewDidLoad()
    // Do view setup here.
    background.image = grass
}

@IBAction func changeGrass(_ sender: Any) {
    background.image = grass
    }

}

3 个答案:

答案 0 :(得分:0)

以下是经过测试的答案

@IBAction func btnChangeImageClick(_ sender: UIButton) {
        let imageFromButton : UIImage = sender.image(for: UIControlState.normal)!

        imgBG.image = imageFromButton
    }

注意:我在操作UIButton时使用Any,因此我们可以从该发送方对象获取图像

答案 1 :(得分:0)

如何解决问题:

  1. 找出是否是按下按钮时的分配问题;将图像设置与按钮回调隔离开来。您已经通过在viewDidLoad
  2. 中分配图像来做到这一点
  3. 找出图像是否损坏。

图像加载失败:

let grass = NSImage(named: NSImage.Name(rawValue: "wetgrass"))

NSImage.init?(named:)生成NSImage?Optional<NSImage>,这意味着加载具有该名称的图像文件可能会失败。当您肯定...... p时,请使用此初始化程序

  • 您的Bundle包含一个名为“ wetgrass.png”的图像文件,该图像文件已复制到应用程序中(请检查“构建设置”>“复制捆绑包资源”),
  • 或您的资产资产目录中包含一个名为“ wetgrass”的条目。

因此grass可能是nil。并且如果为零,则您对background.image的分配将只删除任何先前设置的图像(如果有的话),将NSImageView重置为显示无聊的灰色背景。

最终隔离并检查图像分配是否有效,请使用保证存在的图像,例如内置图像:

let testImage = NSImage(named: .advanced)!

请注意,由于NSImage.Name.advanced可以保证产生图像,因此我会在此处强制打开可选内容:)

这应该可以:

override func viewDidLoad() {
    super.viewDidLoad()
    // Show initial image:
    background.image = NSImage(named: .advanced)!
}

@IBAction func changeGrass(_ sender: Any) {
    // Show grass or another built-in image:
    background.image = grass ?? NSImage(named: .computer)!
}

因此,请检查您的grass != nil

答案 2 :(得分:0)

尝试一下:

@IBAction func changeGrass(_ sender: Any) {
    if let myButton = sender as? UIButton, let currentImage = myButton.imageView?.image {
        background.image = currentImage

        // Animated
        UIView.transition(with: background,
                          duration: 0.75,
                          options: .transitionCrossDissolve,
                          animations: {
                            self.background.image = currentImage
                            })
    }
}