Обновление высоты ячейки после загрузки изображения
я показываю текст и изображения в UITableView. Сначала загружается изображение. Поскольку до загрузки изображения я не знаю размер изображения, поэтому я изначально поставил UIImageView некоторого фиксированного размера. И когда изображение загружается, я изменяю размер UIImageView.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Download image
dispatch_async(dispatch_get_main_queue(), ^{
// UIImageView resizing
});
});
все это происходит в cellForRowAtIndexPath.
Проблемы, с которыми я сталкиваюсь здесь:
1. Как обновить высоту ячейки ? Учитывая, что в одной ячейке может быть много изображений. Так что мне нужно чтобы изменить положение нижнего изображения, когда выше одной загрузки.
2. Я пробовал использовать UITableView beginUpdates и endUpdates, но это прокручивается в верхней части клетки дает плохой пользовательский опыт.
это, как интерфейс выглядит, как на reloadData. Есть 5 изображений для загрузки:пользовательский интерфейс после UITableView reloadData
1 ответов
Короткий Ответ:
- дайте достаточно передышки
estimatedRowHeight - изменение
UITableViewCellпосле возвращения вdequeueReusableCellWithIdentifierбудет не работа с кэшированными клеток - вызвать перезагрузку одной ячейки с
reloadRowsAtIndexPaths - управление кэша с основными данными и пусть
NSFetchedResultsControllerшаблонный код может выполнять всю работу пользовательского интерфейса.
Подробнее
нет неожиданной прокрутки, только обновляет изображения как они приходят:
- если ячейка обновляется at или ниже на горизонте
UITableViewбудет не свиток - если ячейка обновляется выше сверху,
UITableViewбудет не свиток - the
UITableViewбудет прокручиваться только тогда, когда ячейка находится на виду,и требует больше места, чем доступный.
пусть UITableViewAutomaticDimension сделать тяжелую работу
вам нужно сказать Cocoa Touch, что ячейка несвежий, так что это вызовет новая dequeueReusableCellWithIdentifier, к которому вы собираетесь вернуться ячейка с правильной высоте.
За исключением перезагрузки всего представления таблицы или одного из его разделов и предположения, что ваши индексы стабильны, invoke -tableView:reloadRows:at:with: передача indexPath ячейки, которая просто изменилось, и .fade анимация.
код:
override func viewDidLoad() {
super.viewDidLoad()
tableView.estimatedRowHeight = 250 // match your tallest cell
tableView.rowHeight = UITableViewAutomaticDimension
}
использовать URLSession. Когда изображение становится доступным, огонь reloadRows:at:with:
func loadImage(_ url: URL, indexPath: IndexPath) {
let downloadTask:URLSessionDownloadTask =
URLSession.shared.downloadTask(with: url, completionHandler: {
(location: URL?, response: URLResponse?, error: Error?) -> Void in
if let location = location {
if let data:Data = try? Data(contentsOf: location) {
if let image:UIImage = UIImage(data: data) {
self.cachedImages[indexPath.row] = image // Save into the cache
DispatchQueue.main.async(execute: { () -> Void in
self.tableView.beginUpdates()
self.tableView.reloadRows(
at: [indexPath],
with: .fade)
self.tableView.endUpdates()
})
}
}
}
})
downloadTask.resume()
}
раз в кэше, cellForRow просто читает в него из потока пользовательского интерфейса:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCell(withIdentifier: "id") as! CustomCell
cell.imageView.image = cachedImages[indexPath.row] // Read from the cache
return cell
}
пример: получить случайный набор изображений из * Wikipedia*
► найти это решение на GitHub и дополнительные сведения о Swift Рецепты.
