2015-12-03 2 views
0

Я пытаюсь создать Facebook-подобную ленту. Я использую стандартный Tableview с ограничениями автоопределения, установленными в раскадровке.Динамическая высота ячейки с асинхронными изображениями в Swift 2

Ширина должна быть 100% от области просмотра и высоты в соответствии с соотношением сторон изображения.

Я использую hnk_setImageFromURL от Haneke для загрузки асинхронного изображения с сервера.

Я видел here возможности использовать tableview.beginUpdates() или endUpdates() и это приводит к тому, первому воздавать работать нормально, но как только я начинаю прокрутку вычисление высоты идет не так, клетки появляются пустыми и/или приложение падает из-за indexOutOfBounds.

Ручно рассчитывает высоту в heightForRowAtIndexPath с заданным соотношением сторон от сервера единственным вариантом?

Моя соответствующая часть кода

ViewController: 

func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return 500 
} 

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

     let cell = tableView.dequeueReusableCellWithIdentifier("FeedItem", forIndexPath: indexPath) as! FeedItemTableViewCell 

     content.hnk_setImageFromURL(NSURL(string: contentImage)!, placeholder: nil, format: nil, failure: nil, success: {image in 

        cell.content.image = image 
        self.beginUpdates() 
        self.endUpdates() 

       } 
     ) 
} 

P.S. Побочным эффектом, связанным с использованием Haneke, является то, что я должен предоставить некоторый начальный размер UIImageView, в настоящее время я использую изображение с заполнителем, которое вызывает раздражающую анимацию при загрузке изображения с сервера

+0

у вас есть решение? – BorjaCin

+0

@BorjaCin Я предварительно загрузил пропорции для всех изображений и использовал их во всех вычислениях – Shahar

ответ

0

Here вместо загрузки данных ячейки в методе cellForRowAtIndex я создал подкласс TableViewCell. И я использовал SDWebImage вместо Haneke.

Надеюсь, что это поможет

+0

Я не понял часть подклассов TableViewCell (я не видел ссылки на нее в сообщении). Дело в том, что если вы устанавливаете ограничение асинхронно, прокрутка по-прежнему вызывает ожидание, и вам все равно придется называть beginUpdates(), который оживляет высоту. Я пытаюсь объединить решения, сохраняя соотношение сторон на стороне сервера и применяя ограничение синхронно. Это лучше, чем раньше, но все же немного нерешительно. – Shahar

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