2017-01-25 9 views
0

Я показываю 1 изображение в моей ячейке, и высота должна быть изменена в соответствии с соотношением сторон. Но если я не перезагружаю таблицу, ограничение не изменяется и, следовательно, высота ячейки тоже. Если я использую reloadData или перезагружаю определенную строку, это нормально, но влияет на прокрутку. Один из способов - сначала загрузить все изображения, но, возможно, это не так. Как мне это сделать?Обновить ограничение или увеличить высоту в ячейке для отображения размера ячейки после загрузки изображения

Media *media = self.post.medias[0]; 
NSString *imgUrlStr = media.thumbnailUrl; 
[self.ivMain allowTapWithMedia:self.post.medias[0]]; 

UIImage* displayImage = [myCache imageFromDiskCacheForKey:imgUrlStr]; 

if (displayImage) { 
    @try { 

     [self.ivMain setImage:displayImage]; 
     CGFloat ivHeight = (displayImage.size.height/displayImage.size.width) * CGRectGetWidth(self.ivMain.frame); 

     if (roundf(ivHeight) != roundf(self.verticalConstraintIvMain.constant)) 
      [self.verticalConstraintIvMain setConstant:ivHeight]; 

    } @catch (NSException *exception) { 

    } 
} 
else { 
    [self.ivMain setImageWithURL:[NSURL URLWithString:imgUrlStr] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { 

     //image width > iv width 
     //image height .. ? 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      CGFloat ivHeight = (image.size.height/image.size.width) * CGRectGetWidth(self.ivMain.frame); 
      if (roundf(self.verticalConstraintIvMain.constant) != roundf(ivHeight)) { 

       // [self.verticalConstraintIvMain setConstant:ivHeight]; 

       id view = [self superview]; 

       while (view && [view isKindOfClass:[UITableView class]] == NO) { 
        view = [view superview]; 
       } 

       UITableView *tableView = (UITableView *)view; 
       [tableView reloadData]; 
       // [tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:self.tag inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; 
      } 
     }); 
    } usingActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 


} 
+0

Почему бы не написать «Плохо» для изображений? –

+0

Я использую SDWebImage и это асинхронно. –

+0

Но мне нужно сразу обновить высоту после загрузки и отображения изображения. –

ответ

1

Известное решение состоит в том, чтобы не перезаряжать строки во время прокрутки пользователя. Невозможно выполнить основные операции макета и плавно прокручивать одновременно.

Так когда асинхронные изображения скачать вызов возвращается, обнаружить, если пользователь прокручивает, глядя на панели свойств таблицы (унаследованных от UIScrollView) isDragging и isDecelerating. Если пользователь выполняет прокрутку, вместо этого переместите «индексный путь для перезагрузки» на некоторое хранилище. Свойство изменчивого массива для любого источника данных/делегата в представлении таблицы лучше всего по причинам ниже. Когда пользователь перестает прокручивать, перезагружайте пути и очищайте хранилище.

Вы можете сделать последний шаг, выполнив метод UIScrollViewDelegate-scrollViewDidEndDecelerating:. Делегат представления таблицы также является делегатом представления прокрутки. На практике может иметь хороший эффект, чтобы увидеть, как появляются несколько изображений при остановке прокрутки.

+0

Спасибо. Ваша идея хорошая. –

 Смежные вопросы

  • Нет связанных вопросов^_^