swift - Gif 在 UITableViewCell 中消失
问题描述
我正在使用这个问题的答案:如何在 Swift 中加载 GIF 图像?我正在将 gif 添加到 UITableViewCell 中。当您打开表格时,它可以工作并且正在制作动画,但是当我转到另一个 UIViewController 并返回 UITableViewController 时,gif 不存在。它仅在您 .touchUpOutside UITableViewCell 时出现。如何解决这个问题?
class CustomCell: UITableViewCell{
@IBOutlet weak var theImageView: UIImageView!{
didSet{
let loadingGif = UIImage.gifImageWithName("loading")
theImageView.image = loadingGif
}
}
}
解决方案
我将展示在 UITableViewCell 上显示动画 gif 的所有阶段
1)这是我的 GifTableViewController 包含一个 UITableView
import UIKit
class GifTableViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
var gifs = [String]()
override func viewDidLoad() {
super.viewDidLoad()
loadGifs()
}
func loadGifs() {
gifs.append("https://media.giphy.com/media/XIqCQx02E1U9W/giphy.gif")
gifs.append("https://media.giphy.com/media/11JTxkrmq4bGE0/giphy.gif")
gifs.append("https://media.giphy.com/media/eoxomXXVL2S0E/giphy.gif")
gifs.append("https://media.giphy.com/media/c5wbvuaVVLWzC/giphy.gif")
gifs.append("https://media.giphy.com/media/l9Jhzwdi09Ve0/giphy.gif")
gifs.append("https://media.giphy.com/media/8h1Zhv62CVXEc/giphy.gif")
gifs.append("https://media.giphy.com/media/FgiHOQyKUJmwg/giphy.gif")
gifs.append("https://media.giphy.com/media/h2MLtoOjxtkGY/giphy.gif")
gifs.append("https://media.giphy.com/media/ClKnUxoh4SP16/giphy.gif")
gifs.append("https://media.giphy.com/media/S6fA9ppFTwFhK/giphy.gif")
gifs.append("https://media.giphy.com/media/EGiBhTZMXedIA/giphy.gif")
}
}
extension GifTableViewController: UITableViewDataSource, UITableViewDelegate {
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return gifs.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "GifTableCell", for: indexPath) as! GifTableCell
cell.load(with: gifs[indexPath.row])
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 200
}
}
2)这是我的 GifTableCell ,其中包含一个 UIImageView ,它将代表 gif
import UIKit
class GifTableCell: UITableViewCell {
@IBOutlet weak var gifImageView: UIImageView!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
func load(with urlString: String) {
gifImageView.image = nil
DispatchQueue.global().async { [weak self] in
guard let url = URL(string: urlString as String) else {
return
}
guard let data = try? Data(contentsOf: url) else {
return
}
DispatchQueue.main.async {
self?.gifImageView.image = UIImage.gif(data: data)
}
}
}
}
3)注意那UIImage.gif(data: data)
句话。gif 函数是来自 SwiftGifOrigin 库的 UIImage 扩展
见源:https ://github.com/swiftgif/SwiftGif
您可以只添加UIImage+Gif.swift
文件以便简单地使用,或者将 SwiftGifOrigin 库包含到您的项目中。
问题更新的编辑;
上面的示例显示 gif 是从 url 加载的。你的case其实简单多了,你的cell应该是这样的。
class CustomCell: UITableViewCell{
@IBOutlet weak var theImageView: UIImageView!
func loadGif() {
theImageView.image = nil
DispatchQueue.global().async { [weak self] in
let loadingGif = UIImage.gifImageWithName("loading")
DispatchQueue.main.async {
self?.theImageView.image = loadingGif
}
}
}
}
推荐阅读
- apache - Apache2 和 solr 与 SSL 使用 proxypass
- ios - 包含在 UIBarButtonItem 中时增加 UIButton 的固有大小
- php - 从 php 中的 url 抓取数据,第一个 url 有效,但其他具有相同结构的 url 没有,只有 id 不同
- android - 哪种方法更适合自定义视图:创建新的 Handler 还是使用现有的?
- clojure - 我不确定这个函数如何让线程进入睡眠状态
- javascript - 调用设置的间隔函数时触发倒计时
- python - 如何在 PyCharm 的项目选项卡中跟踪活动项目
- r - How to selectively multiply columns
- rxjs - 最多每 x 秒从流中发出值
- flutter - 如何在书写时隐藏/移动图像