情节提要中设置的图像与代码中声明的UIImage(名称:“日出”)对象不相等

问题描述 投票:0回答:1

我按照Swift教程在UIImageView上实现了一个简单的淡入/淡出动画。在本教程中,运行项目后,按一个按钮将触发sunRiseAndSet(sender: AnyObject)功能,然后在动画先淡出然后淡入后,图像将从日出变为日落。

但是在我这边,第一次触摸时图像没有改变,再次单击时图像就改变了。我检查了并将imageView连接到情节提要中,并将其分配为名为“ sunrise”的图像,并且代码与指南相同。并发现此行if (self.imageView.image == UIImage(named: "sunrise"))与第一次触摸按钮不相同。你能给我一些线索是什么原因?

/ / /代码在这里:

import UIKit

// MARK: - ViewController: UIViewController

class ViewController: UIViewController {

    // MARK: Outlets

    @IBOutlet weak var imageView: UIImageView!

    // MARK: Actions

    @IBAction func sunRiseAndSet(sender: AnyObject) {
        // Fade out
        imageView.fadeOut(duration: 1.0, delay: 0.0,
        completion: {
                (finished: Bool) -> Void in

                if self.imageView.image != nil {
                    print("image exist")
                }
                //Once the label is completely invisible, set the text and fade it back in
                if (self.imageView.image == UIImage(named: "sunrise")) {
                    self.imageView.image = UIImage(named:"sunset")!
                    print("sunset")
                } else {
                    self.imageView.image = UIImage(named:"sunrise")!
                    print("sunrise")
                }

                // Fade in
                self.imageView.fadeIn(duration: 1.0, delay: 0.0, completion: nil)
        })
    }
}
import Foundation
import UIKit

// MARK: - UIView (Extensions)

extension UIView {

    func fadeOut(duration: TimeInterval, delay: TimeInterval, completion: ((Bool) -> Void)?) {
        UIView.animate(withDuration: duration, delay: delay, options: UIViewAnimationOptions.curveEaseIn, animations: {
        self.alpha = 0.0
        }, completion: completion)
    }

    func fadeIn(duration: TimeInterval, delay: TimeInterval, completion: ((Bool) -> Void)?) {
        UIView.animate(withDuration: duration, delay: delay, options:UIViewAnimationOptions.curveEaseIn, animations: {
        self.alpha = 1.0
        }, completion: completion)
    }
}
swift uiimageview
1个回答
0
投票

您是正确的。比较两个不同图像实例(在情节提要中设置一个,在代码中实例化一个)的相等运算符将不会认为它们相等。

如果您希望代码按预期工作,请在viewDidLoad中显式设置图像:

override func viewDidLoad() {
    super.viewDidLoad()
    imageView.image = UIImage(named: "sunrise")
}

...,或者通过获取它们的数据表示来进行比较,即使在情节提要中设置了数据表示,它们也应相等:

if (self.imageView.image?.pngData() == UIImage(named: "sunrise")?.pngData()) { // your code}

使用原始代码,我通过将输出输出到控制台进行了进一步的测试:

print(self.imageView.image)

每次按一下按钮。结果:

image exist
Optional(<UIImage:0x600000898510 anonymous {3220, 3155}>)
sunrise
image exist
Optional(<UIImage:0x6000008b0fc0 named(sunrise) {3220, 3155}>)
sunset
image exist
Optional(<UIImage:0x600000898fc0 named(sunset) {500, 500}>)
sunrise
image exist
Optional(<UIImage:0x6000008b9830 named(sunrise) {3220, 3155}>)
sunset
image exist
Optional(<UIImage:0x6000008b4f30 named(sunset) {500, 500}>)
sunrise
image exist
Optional(<UIImage:0x600000898fc0 named(sunrise) {3220, 3155}>)
sunset
image exist
Optional(<UIImage:0x6000008bc900 named(sunset) {500, 500}>)
sunrise

注意,只有第一次它会显示带有部分字符串描述“ anonymous”的UIImage。该方法的所有成功调用仅交替输出“ named(sunrise)”​​或“ named(sunset)”。还要注意,十六进制值始终在变化,这表明每次调用UIImage()都会初始化一个新的不同实例。

您可以通过在VC中将2个UIImage设置为常量属性并再次测试来进行检查:

let sunriseImage = UIImage(named: "sunrise")
let sunsetImage = UIImage(named: "sunset")

在这种情况下,在打印到控制台时,在任何使用UIImage(name ..)的位置替换常量都将导致两个UIImage的十六进制值保持不变。

© www.soinside.com 2019 - 2024. All rights reserved.