セル内の画像を表示するためにSDWebImageを使用しています。しかし、私が以下のコードで行っているのは、UImageViewのフレームに完全に一致しています。
NSString * s =[NSString stringWithFormat:@"url of image to show"];
NSURL *url = [NSURL URLWithString:s];
[cell.shopImageView sd_setImageWithURL:url];
私のUIImageViewのサイズは50x50です。
たとえば、URLの画像のサイズは990x2100で、指定されたフレームで画像がうまく表示されません。この場合、高さが大きい場合は、幅50に一致するように適切な高さの比率で画像のサイズを変更します。
ダウンロードしたりメモリを割り当てたりせずに、URLから画像のサイズを確認する方法はありますか?
このデータはURLヘッダーから取得できますSwift 3.以下のコードを使用してください
if let imageSource = CGImageSourceCreateWithURL(url! as CFURL, nil) {
if let imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) as Dictionary? {
let pixelWidth = imageProperties[kCGImagePropertyPixelWidth] as! Int
let pixelHeight = imageProperties[kCGImagePropertyPixelHeight] as! Int
print("the image width is: \(pixelWidth)")
print("the image height is: \(pixelHeight)")
}
}
さまざまなcontentModeオプションをいじって、必要な外観を取得してください。一例はcell.shopImageView.contentMode = UIViewContentModeScaleAspectFit;
これにより、画像が適切にフィットしますが、実際には画像ビューのサイズは変更されません。
ContentModeオプションは次のとおりです。 IViewContentModes
代替案は、これに沿ったものである可能性があります。
NSData *data = [[NSData alloc]initWithContentsOfURL:URL]; UIImage *image = [[UIImage alloc]initWithData:data]; CGFloat height = image.size.height; CGFloat width = image.size.width;
次に、画像の高さ/幅の比率に応じて、imageViewの高さ/幅を設定できます。
画像をダウンロードせずにURLから画像のサイズを取得する方法がわかりません。
ただし、画像のダウンロード後にUIImageViewフレームを比例的に作成するためのコードスニペットを提供できます。
NSData *data = [[NSData alloc]initWithContentsOfURL:URL]; // -- avoid this.
上記の方法を使用して画像をダウンロードすると、UIがブロックされます。ですから避けてください。
[cell.shopImageView ....]; // -- avoid this method.
SDWebImageを使用しているので、最初に画像をダウンロードするための専用のメソッドがいくつかあると思います。したがって、上記で使用したUIImageViewカテゴリメソッドを使用する代わりに、そのメソッドを使用して画像をダウンロードできます。
画像をダウンロードした後。以下のようなものを試してください。
コードスニペット
画像がダウンロードされ、オブジェクトが「theImage」であり、セルのimageviewとして「imageView」であると想定します。
float imageRatio = theImage.size.width/theImage.size.height;
float widthWithMaxHeight = imageView.frame.size.height * imageRatio;
float finalWidth, finalHeight;
if (widthWithMaxHeight > imageView.frame.size.width) {
finalWidth = imageView.frame.size.width;
finalHeight = imageView.frame.size.width/imageRatio;
} else {
finalHeight = imageView.frame.size.height;
finalWidth = imageView.frame.size.height * imageRatio;
}
[imageView setFrame:CGRectMake(xOffset, yOffset, finalWidth, finalHeight)];
[imageView setImage:theImage];
let ImageArray = ((arrFeedData[indexPath.row] as AnyObject).value(forKey: "social_media_images") as? NSArray)!
var ImageURL: String = ((ImageArray[0] as AnyObject) as? String)!
ImageURL = ImageURL.addingPercentEscapes(using: String.Encoding.ascii)!
let imageUrl = URL(string: ImageURL)
let imageData = try Data(contentsOf: imageUrl!)
let image = UIImage(data: imageData)
print("image height: \(image?.size.height)"
print("image Width: \(image?.size.width)")