ついに完成しました!!
CellにURLのイメージを使う際に使う用に作りました。
Cell を用いる際に、URLから画像を読み込んでということをしたいときに
Image に対して、読み込んだ後で表示するようにしてみたんです。
何度か、トライしてみたんですが、表示がうまくいかない!!って困っていたんです。
しかしながらやっと回答を出せました。
closeButton
closeButton には、戻るボタンや画面遷移してしまった時に、loadが終わってないのに移動を防げるように作ってみました
var tableItem:[SampleCellItem] = []
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell()
let cellItem = tableItem[indexPath.row]
cell.detailTextLabel = cellItem.imageURL
cell.imageCellItem(cellItem: cellItem) { imageType in
self.closeButton.isEnabled = false
} completion: { image,imageType in
if tableView.visibleCells.contains(cell) {
tableView.reloadRows(at: [indexPath], with: .automatic)
}
self.closeButton.isEnabled = true
}
return cell
}
UITableViewCell
UITableViewCellを拡張しました
extension UITableViewCell {
enum ImageType {
case none
case imageData
case otherObject
case imageLoading
case image
case imageURLLoading
case imageURL
}
func imageCellItem(cellItem:SampleCellItem,
loadHandler: ((ImageType) -> Void)? = nil,
completion: ((UIImage?,ImageType) -> Void)? = nil) {
self.imageView?.image = nil
if let image = cellItem.imageData as? UIImage {
self.imageView?.image = image
completion?(image,
.imageData)
} else if cellItem.otherObject != nil {
if let image = cellItem.otherObject as? UIImage {
self.imageView?.image = image
completion?(image,
.otherObject)
}
} else if let imageURL = cellItem.imageURL {
loadHandler?(.imageURL)
UIImage.load(urlString: imageURL) { image, finish in
if finish {
cellItem.imageURL = imageURL
cellItem.imageData = image
completion?(image,
.imageURL)
} else {
completion?(image,
.imageURLLoading)
}
}
} else if let imageURL = cellItem.image {
loadHandler?(.image)
UIImage.load(urlString: imageURL) { image, finish in
if finish {
cellItem.imageURL = imageURL
cellItem.imageData = image
completion?(image,
.image)
} else {
completion?(image,
.imageLoading)
}
}
} else {
completion?(nil,
.none)
}
}
}
###UIImage
UIImage 拡張 URLなどでイメージをロードした後に処理する方法
extension UIImage {
static func load(urlString : String,completion: ((UIImage?,Bool) -> Void)? = nil) {
guard let url = URL(string: urlString)else {
return
}
DispatchQueue.global().async { [self] in
if let data = try? Data(contentsOf: url) {
if let image = UIImage(data: data) {
DispatchQueue.main.async {
if self != nil {
completion?(image,true)
}
}
} else {
completion?(nil,false)
}
} else {
completion?(nil,false)
}
}
}
}
###SampleCellItem
SampleCellItem は1つのセルにイメージをセットする時の情報を格納
class SampleCellItem {
var image:String? = nil
var imageURL:String? = nil
var imageData:Any? = nil
var otherObject:Any? = nil
}
まとめ
今回は、Cell のイメージをURLからデータを扱う際に、必要な処理を作ってみました。
データを読み込んだり、データなのかイメージなのかロード後なのかを判定する機能を作ってみました。
よかったら使ってみてください
【About】(http://qiita.com/sunstripe) - サンストライプ
制作チーム:サンストライプ
(月1 WEBコンテンツをリリースして便利な世の中を作っていくぞ!!ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中!!)
緩募
地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます!!
https://the.themedia.jp/
ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える
プログラミングワークショップ・ウェブ塾の開講!!!
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
プログラミングサロン 月1だけのプログラミング学習塾
協力応援 / 支援者の集い
チーム:サンストライプ
プログラミングラボ
一緒にポートフォリオを作りませんか?現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週1のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております!!
興味がある方は、DMに話しかけてみてください。
トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼、人と考えてます。
「コンサルティング」と「クリエイティブ」の両角度から「人材戦略パートナー」としてトータル的にサポートします!!
キャリア教育事業
青空プログラミング
広域学習支援プラットフォーム『のびのび日和』
#スポンサー募集
ネリム
https://nerim.co.jp/
配信事業などを映像コンテンツなどの制作しております