2016-12-20 6 views
2

私はテーブルビューを持っています。画像とテキストで古典的なリストを作成したいと思います。大きな画像のUITableViewCellは液体ではありません

これは私のcellForRowAtIndexPathです。画像の精緻化なしではすべて正常に動作しますが、これはビューコントローラを表示するのが非常に遅く、スクロールは流動的ではありません。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 

    static NSString *simpleTableIdentifier = @"SimpleTableItem"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 

    NSDictionary* element = [dataSource objectAtIndex:indexPath.row]; 

    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier]; 
    } 


    NSString* imageUri = [element valueForKey:@"uri"]; 
    UIImage* image = [UIImage imageWithContentsOfFile:imageUri]; 
    CGFloat wImg = image.size.width * cell.frame.size.height/image.size.height; 

    CGSize newSize = CGSizeMake(wImg, cell.frame.size.height); 
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0); 
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 



    cell.textLabel.text = [ element valueForKey:@"text"]; 
    cell.imageView.image = newImage; 

    return cell; 

} 

私は大きなイメージ(iphone写真)を持っていますが、これを行うにはどうすればよいですか?

+0

contentModeプロパティを設定しますか? – fabe

+1

@Polあなたは 'UIGraphicsEndImageContext'を実行するために 'async dispatch'を使うことができます。そして、それらのコードを' if cell == nil {} ' – aircraft

+0

@aircraftに入れてください。解決されました。あなたは 'async dispatch'でコードを書くことができますか? – Pol

答えて

2

セルを読み込むたびにサイズを変更するのではなく、サイズ変更したイメージをキャッシュして代わりに使用すると、パフォーマンスが向上します。

+0

内部を入れるif(cell == nil)画像変換私はスクロールの問題を解決しましたが、今問題は低速です。 あなたの解決策では、if(cell == nil)にコードを入れるなど、すべての画像に対して作業を行います – Pol

+0

セルを表示するためにイメージのサイズを変更する必要があるため、常にロードが遅くなります。セルに非同期にイメージをロードすると、ロード時間が遅くなることが修正されています。 – Abizern

-1

コアグラフィックを使用した画像のサイズ変更は、非常に高価な操作であり、スクロールが流動的でないようにするユーザーエクスペリエンスに影響しています。

単に画像を使用して、なぜ画像が必要なリサイズされcell.imageView

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 

    static NSString *simpleTableIdentifier = @"SimpleTableItem";<br/> 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 

    NSDictionary* element = [dataSource objectAtIndex:indexPath.row]; 

    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier]; 
    } 


    NSString* imageUri = [element valueForKey:@"uri"]; 
    UIImage* image = [UIImage imageWithContentsOfFile:imageUri]; 


    cell.textLabel.text = [ element valueForKey:@"text"]; 
    cell.imageView.image = newImage; 
    cell.imageView.contentMode = UIViewContentModeScaleAspectFill; 


    return cell; 

} 
+0

私は試しましたが、何も変わりません – Pol

+0

残念ながら、これはどのように動作するのではありません。画像は小さく表示されていますが、大きな画像はそれを裏付けしており、それがアニメーションに影響しています。これを楽器で実行すると、これを自分で見ることができます。 – Abizern

関連する問題