ダウンロードが進行するまでimageviewの背景色を表示したいのですが、ダウンロードが失敗したり、画像が利用できない場合は、プレースホルダー画像を表示したいと思います。どうすればこれを達成できますか?
主な目的は、ロード中ではなく、後で画像を設定することです。
ありがとう
Swift 3の解決策:
cell.imageView?.sd_setImage(with: url) { (image, error, cache, urls) in
if (error != nil) {
cell.imageView.image = UIImage(named: "ico_placeholder")
} else {
cell.imageView.image = image
}
}
Objective Cのソリューション:
[cell.imageView sd_setImageWithURL:url
placeholderImage:nil
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
if (error) {
self.imageView.image = [UIImage imageNamed:@"ico_placeholder"];
} else {
self.imageView.image = image;
}
}];
皆さんがこれがお役に立てば幸いです。
SDWebImageから ドキュメント :
ブロックの使用
ブロックを使用すると、画像のダウンロードの進行状況と、画像の取得が成功したかどうかを通知できます。
// Here we use the new provided sd_setImageWithURL: method to load the web image
for Swift:
cell.imageView.sd_setImageWithURL(url, placeholderImage:nil, completed: { (image, error, cacheType, url) -> Void in
if (error) {
// set the placeholder image here
} else {
// success ... use the image
}
})
objective-Cの場合
[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
placeholderImage:nil
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
if (error) {
self.imageView.image = [UIImage imageNamed:@"placeHolderImage"];
}
}];
読み込み/エラー画像を分離するための拡張機能です。 LoadingImageは、SDWebImageがplaceholderImageと呼んだものになります。読み込みがうまくいかなかった場合、errorImageが実際のプレースホルダーになります。
import Foundation
import SDWebImage
extension UIImageView {
/// Separated loader and error images, short version.
func zap_setImage(with url: URL?, loadingImage: UIImage?, errorImage: UIImage) {
self.zap_setImage(with: url, loadingImage: loadingImage, errorImage: errorImage, completed: nil)
}
/// Separated loader and error images, long version.
func zap_setImage(with url: URL?, loadingImage: UIImage?, errorImage: UIImage, completed: SDExternalCompletionBlock?) {
self.sd_setImage(with: url, placeholderImage: loadingImage, options: []) { [weak self] (uiimage: UIImage?, error: Error?, sdimagecachetype: SDImageCacheType, usedurl: URL?) in
//print("ISSUE1688 uiimage: \(String(describing: uiimage)), error: \(String(describing: error))")
let setErrorImage: Bool
switch error {
case .none:
// No error?
if uiimage == nil {
// No error, but no image, so use error image
setErrorImage = true
}
else {
setErrorImage = false
}
break
case .some(_):
// case .some(let errorvalue):
// Error?
//print("ISSUE1688 errorvalue: \(errorvalue)")
setErrorImage = true
break
}
//print("ISSUE1688 setErrorImage: \(setErrorImage)")
if setErrorImage {
self?.image = errorImage
}
if let c = completed {
c(uiimage, error, sdimagecachetype, usedurl)
}
}
}
}
これを行うには、nil
をプレースホルダー属性に渡し、完了ブロックを自分で処理します。
このような :
[self.imageView sd_setImageWithURL:self.imageURL
placeholderImage:nil
options:nil
progress:nil
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
if(!error) {
self.imageView.image = image;
} else {
self.imageView.image = [UIImage imageNamed:@"placeHolder"];
}
}];
私はそれを試していません。それを試してみて、それがあなたのために働いたかどうか教えてください。
'SDWebImage'の場合、 '〜> 4.0'このimageview拡張機能を使用します
extension UIImageView {
func setImage(imageString: String, localUri: String = "", placeHolderImage: UIImage? = nil, loader: Bool = true, loaderType : UIActivityIndicatorView.Style = .white) {
self.sd_setShowActivityIndicatorView(loader)
self.sd_setIndicatorStyle(loaderType)
if let url = URL(string: localUri), let data = try? Data(contentsOf: url), let img = UIImage(data: data) {
self.sd_setImage(with: URL(string: imageString), placeholderImage: img, options: SDWebImageOptions(), progress: { (progress, total, url) in
}) { (img, err, type, url) in
}
} else {
self.sd_setImage(with: URL(string: imageString), placeholderImage: placeHolderImage, options: SDWebImageOptions(), progress: { (progress, total, url) in
}) { (img, err, type, url) in
}
}
}
}
これを使用できます。
cell.img_UserProfile.sd_setImage(with: URL.init(string: "\(BaseURL_Image)\(image)"), placeholderImage: #imageLiteral(resourceName: "Group 1131"), options: .highPriority, context: [:])