我按照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)
}
}
您是正确的。比较两个不同图像实例(在情节提要中设置一个,在代码中实例化一个)的相等运算符将不会认为它们相等。
如果您希望代码按预期工作,请在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的十六进制值保持不变。