Я построил образец проекта, размещенный на GitHub.
Существует представление таблицы, и его пользовательская ячейка имеет несколько строк UILabel и базу данных динамического изображения с ее размером изображения. Я построил его шаг за шагом, чтобы проверить проблему автоматического макета в пользовательской ячейке.
В третьем представлении таблицы таблиц (Table3ViewController
), который имеет вышеуказанную структуру представления, я проверил его с образцом случайной длины и локальными изображениями. Это удается, так же как документация Apple и этот поток.
На самом деле, все учебники по автоматическому компоновке или примеры из результатов поиска google тестируются на основе локальных ресурсов изображения, в основном не связанных с использованием SDWebImage
.
В Table4ViewController
UIImageView/UITableViewCell (CustomCell) завершил свой макет представления перед тем, как SDWebImage
асинхронно установил конечный объект изображения в UIImageView.
Вот мой вопрос, как перенастроить UITableViewCell (CustomCell) после SDWebImage
скачало изображение из сети?
Вот мои ограничения в CustomCell.
[label mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.contentView.top);
make.centerX.width.equalTo(self.contentView);
make.bottom.equalTo(imageView.top);
make.height.greaterThanOrEqualTo(@16);
}];
[imageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(label.bottom);
make.bottom.equalTo(self.contentView.bottom);
make.centerX.width.equalTo(self.contentView);
make.height.lessThanOrEqualTo(@200);
}];
Я попытался переместить реализацию в метод initWithStyle:reuseIdentifier:
или updateConstraints
или layoutSubviews
, все результаты совпадают и не удались.
Вот назначение изображения в cellForRow
без изображения-заполнителя.
__weak __typeof(cell) weakCell = cell;
[cell.theImageView sd_setImageWithURL:[NSURL URLWithString:dict.allValues.firstObject]
completed:^(UIImage *_Nullable image, NSError *_Nullable error, SDImageCacheType cacheType, NSURL *_Nullable imageURL) {
__strong __typeof(cell) strongCell = weakCell;
[strongCell setNeedsUpdateConstraints];
[strongCell updateConstraintsIfNeeded];
}];
Предположим, что сетевое изображение имеет размер 400х400 точек, в ячейке нет зарезервированного изображения-заполнителя, запрос на просмотр и ограничение по представлению макета будет готов и закончен асинхронно. Однако новая высота ячейки не будет пересчитана в contentSize таблицы, процесс рисования CustomCell не будет вызываться. Он терпит неудачу.
Вот назначение изображения в cellForRow
с изображением заполнителя.
__weak __typeof(cell) weakCell = cell;
[cell.theImageView sd_setImageWithURL:[NSURL URLWithString:dict.allValues.firstObject]
placeholderImage:GetImageWithColor(DarkRandomColor, CGRectGetWidth(tableView.frame), 400)
completed:^(UIImage *_Nullable image, NSError *_Nullable error, SDImageCacheType cacheType, NSURL *_Nullable imageURL) {
__strong __typeof(cell) strongCell = weakCell;
[strongCell setNeedsUpdateConstraints];
[strongCell updateConstraintsIfNeeded];
}];
Окончательное изображение будет нарисовано с таким же размером зарезервированного изображения заполнителя в конце, но я ожидал, что конечный размер изображения будет даже задан.
Итак, как перенастроить ограничение размера представления изображения после загрузки изображения асинхронно?
Пожалуйста, помогите, спасибо!