2016-09-12 3 views
2

INFO:Динамического размера ячейки в зависимости от размера изображения извлеченного из URL в прошивкой

Tableview У меня есть, который с ячейками с Imageview. В этом ImageView, я выборка различных изображений из imgURL ...

Что мне нужно:

мне нужна динамическая высота ячейки в зависимости от высоты изображения извлекаться из imgURL.

ПРИМЕЧАНИЕ: Я не использую автомат, но я использую автоматическое изменение размера.

Что я сделал до сих пор:

Я использовал асинхронной загрузки изображения в ImageView. (По #import "UIImageView+WebCache.h")

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

    HomePostCell *cell=[tableView dequeueReusableCellWithIdentifier:strIdentifier]; 
    if (cell==nil) { 
     cell = [[HomePostCell alloc] 
       initWithStyle:UITableViewCellStyleDefault 
       reuseIdentifier:strIdentifier]; 
    } 

    [cell.imgMain sd_setImageWithURL:[NSURL URLWithString:strImgURL] placeholderImage:[UIImage imageNamed:@"postPlaceholder"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { 
     if (!error) { 

    }]; 


    return cell; 
} 

right now screen of tableview

Есть ли решение для этого? или мы можем использовать автоматический макет только для изменения размера ячейки?

Заранее спасибо ..

+0

Проверить это [категория] (https://github.com/foundry/UIImageMetadata) – iphonic

+0

может у обеспечить способ, как использовать это в моем случае – Simmy

+0

Категория может получать метаданные изображения, например EXIF, который содержит информацию о разрешении изображения, поэтому вы можете получить размер изображения перед загрузкой изображения и предоставить размер ячейки. – iphonic

ответ

4

В идеальном случае, я обычно ожидать, что API, чтобы вернуть все изображения с одинаковым размером или размером, который можно настроить с помощью параметров строки запроса, например: /get_image/?width=400&height=400 т.д.

Во всяком случае, проблема вот то, что вы не можете обновить высоту ячейки после ее создания и быть готовым к рисованию на экране (другими словами, как только она была возвращена с cellForRowAtIndexPath), если вы не перезагрузите эту ячейку или всю таблицу просмотреть вручную. К счастью для нас, sd_setImageWithURL работает в асинхронном режиме, что означает, что у вас будет возможность позвонить tableView.reloadRowsAtIndexPath после того, как изображение будет извлечено и сохранено.

Перезагрузка вызовет heightForRowAtIndexPath для вызова в перезаряженную ячейку, поэтому на этот раз мы получим правильную высоту.

(Поскольку ячейки табличного представления являются объектами многократного использования, они не хранят никакой информации о данных, которые они используют для настройки своего пользовательского интерфейса. Таким образом, вам необходимо сохранить изображения в контроллере просмотра, предпочтительно внутри массива ,)

@interface ViewController() 

@property (nonatomic, strong) NSMutableArray *fetchedImages; 
@end 

@implementation ViewController 
... 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UIImage *image = [self.fetchedImages objectAtIndex:indexPath.row]; 
    if (image) { 
    return image.size.height + 1.0; // 1.0 for the separator. 
    } 
    else { 
    return 50.0; // Default value.. 
    } 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return self.fetchedImages.count; 
} 

С учетом всего сказанного, можно сделать что-то вроде следующего в (tableView:cellForRowAtIndexPath:) метода:

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

    UIImage *image = [self.fetchedImages objectAtIndex:indexPath.row]; 

    if (image) { 
    // If there is image don't bother fetching the image. 
    cell.imageView.image = image; 
    } 
    else { 
    NSURL *imageURL = [self.imageURLs objectAtIndex:indexPath.row]; 
    [cell.imageView sd_setImageWithURL:imageURL placeholderImage:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { 
    if (image) { 
     [self.fetchedImages replaceObjectAtIndex:indexPath.row withObject:image]; 
     [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]; 
    } 
    }]; 
    return cell; 
} 

Вот результат я в конечном итоге:

enter image description here

You можно загрузить test project и поиграть с ним, чтобы лучше понять, что я сделал Бова.

1

этот код работать с автоматическим изменением размеров, может помочь вам.

#define Screen_Width [[UIScreen mainScreen] bounds].size.width 
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
{ 
    return imageHeight; 
} 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
NativeStreamAdCell *cell=(NativeStreamAdCell *)[tableView dequeueReusableCellWithIdentifier:@"SimpleTable"]; 
     if(cell==nil) 
     { 
      NSArray *nib=[[NSBundle mainBundle]loadNibNamed:@"NativeStreamAdCell" owner:self options:nil]; 
      cell=[nib objectAtIndex:0]; 
     } 
     [cell.postImg sd_setImageWithURL:[NSURL URLWithString:[dic_feed valueForKey:@"feed_image"]] placeholderImage:cell.postImg.image options:SDWebImageRefreshCached]; 
     //Display image based on size 
     UIImage *img = cell.postImg.image; 

     int image_width = img.size.width; 
     int image_height = img.size.height; 
     image_width = Screen_Width; 
     image_height = (Screen_Width * img.size.height/img.size.width); 
     if(image_width > image_height) { 
      image_height = (Screen_Width * image_height/image_width); 
     } 
     cell.postImg.frame = CGRectMake(cell.postImg.frame.origin.x, cell.postImg.frame.origin.y, 
            image_width,image_height); 

     imageHeight = CGRectGetMaxY(cell.postImg.frame); 
     return cell; 
} 
0

Следящий example of Ozgur Vatansever, но он мерцает при быстрой прокрутке.

Даже this не помогло.

Я обнаружил, что [self.tableView reloadData] работы вместо

[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]; 

ИЛИ

[weakSelf.tableView beginUpdates]; 
[weakSelf.tableView endUpdates];