実行時に画像の URL を取得しています。これらの画像をダウンロードしてテーブルに表示したいと考えています。画像は非同期でダウンロードされます。さらに重要なことは、これらすべての画像を実際のサイズで表示したいということです。
親切に私を助けてください。前もって感謝します:)
実行時に画像の URL を取得しています。これらの画像をダウンロードしてテーブルに表示したいと考えています。画像は非同期でダウンロードされます。さらに重要なことは、これらすべての画像を実際のサイズで表示したいということです。
親切に私を助けてください。前もって感謝します:)
UIImageView
ダウンロードした画像通りのサイズにできますが、見栄えが悪くなります。
だから私はあなたのすべての画像を同じサイズにすることをお勧めします。
これを使用して、すべての画像を同じサイズにすることができます。
+ (UIImage *)imageScaledToSizeWithImage:(UIImage *)imagewww andsizeee:(CGSize)size
{
//avoid redundant drawing
if (CGSizeEqualToSize(imagewww.size, size))
{
return imagewww;
}
//create drawing context
UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);
//draw
[imagewww drawInRect:CGRectMake(0.0f, 0.0f, size.width, size.height)];
//capture resultant image
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//return image
return image;
}
ただし、実際に異なる行サイズのテーブルを表示したい場合は、実行時に行サイズを変更してください
画像を取得したら、画像をディクショナリに保存します。キー値は行のindexPathです。
[tableImageDict setObject:image forKey:[NSString stringWithFormat:@"%i,%i",indexPath.row,indexPath.section]];
次に、テーブルの行をリロードします。
[table reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationNone];
行の高さが変わります
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
UIImage *image = (UIImage *)[tableImageDict objectForKey:
[NSString stringWithFormat:@"%i,%i",
indexPath.row,indexPath.section]];
if (image != nil)
{
return image.size.height;
}
else{
return 44.0;
}
}
まず、非同期ダウンロードにSDWebImageを使用することを強くお勧めします (まだ行っていない場合)。必要に応じて、イメージをメモリまたはディスクにキャッシュすることができます。後者は、イメージを特別なキャッシュ フォルダに保存することで正しい方法で行われるため、iOS がスペースを使い果たした場合はイメージを削除できます。また、AFNetworking が提供するものと同様に、UIImageView で便利なカテゴリを提供しますが、より多くのオプションとオプションの完了ブロックがあります。そうすれば、次のようなことができます。
#import <SDWebImage/UIImageView+WebCache.h>
...
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// Create the cell...
[cell.myImageView setImageWithURL:[NSURL URLWithString:@"http://example.com/image.jpg"]
placeholderImage:[UIImage imageNamed:@"placeholder"]
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {
if (image != nil) {
[self.images insertObject:image atIndex:indexPath.row];
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:YES];
}
}];
return cell;
}
そうすれば、画像を非同期でダウンロードし、UIImageView を正しく設定しますが、ブロックを使用して画像を NSMutableArray に保存することもできるため、テーブルビューに正しい高さを伝えることができます。また、画像が読み込まれたセルの高さを更新するようにテーブル ビューに指示します。次に、テーブル ビューが特定のセルの高さを知る必要がある場合、画像が読み込まれている場合は、そこからサイズを取得します。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
id image = [self.images objectAtIndex:indexPath.row];
if ([image isKindOfClass:[NSNull class]]) {
return defaultHeight;
} else {
return [image size].height + topPadding + bottomPadding;
}
}
そうすれば、画面外にある画像の高さもわかります (たとえば、一番下までスクロールした場合)。このソリューションでは、NSMutableArray に NSNull 値を設定することから始めて、読み込み時に画像に置き換えられることを前提としています。最後に、必要に応じて、SDWebImageManager を使用して、セルが表示される前でも手動でダウンロードを開始できます。
チェックアウトしてくださいheightForRowAtIndexPath:
。これについての別の投稿があります。
そのためには、カスタム UITableviewCell を作成する必要があり、このコードを使用してテーブル ビュー セルのサイズを設定できます。
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
int rowHeight =0.0f;
// here u can get particular Url by indexPath.row, now create UIImage object using that Url
CGRect bioHeadingFrame = image.frame;
rowHeight = size.height; //get the height of that image
return rowHeight;
}
今あなたの表のセルの高さは、画像の高さに応じて増加しています
非同期ダウンロードが実際の問題である場合は、AFNetworkingライブラリの UIImageView カテゴリを参照してください。特にこの機能:
- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholderImage
この UIimageview カテゴリをプロジェクトに含めて、そのクラスから派生したセル イメージを設定できます。