Я снова проверил ваши скриншоты.Все выглядит хорошо для меня.Теперь я все еще догадываюсь здесь.Обычно, когда возникает предупреждение о таких ограничениях, даже если это занимает мое время, я решаю это.Хорошо, что у вас уже есть размер изображения данных.
Из этого блока кода:
self.userContentImageView.kf.setImage(with: URL(string: image.url), completionHandler: { (_, _, _, _) in
self.setNeedsLayout()
self.layoutIfNeeded()
})
Это ужасно и определенно приведет к появлению мерцающей или нежелательной ошибки анимации / движения, как в вашемдемонстрация видео.
Обычно для меня достаточно self.layoutIfNeeded()
, чтобы настроить макет ПОСЛЕ настройки ограничения любого вида.
Таким образом, ваш блок кода может быть преобразован в следующее:
let ratio = CGFloat(image.width) / CGFloat(image.height)
userContentImageViewHeightConstraint.constant = CGFloat((UIScreen.main.bounds.width) / ratio)
self.layoutIfNeeded()
self.userContentImageView.kf.indicatorType = .activity
self.userContentImageView.kf.setImage(with: URL(string: image.url), completionHandler: { (_, _, _, _) in })
ИЛИ ЛУЧШЕ, (я понял, что это внутри вашей ячейки):
Прежде чем вы вернете свою ячейку в cellForRow
, вы выполните настройку ограничений!Раньше у меня был личный проект с тем же потоком / логикой, что и у вас - случайные размеры изображений с сетевыми вызовами.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
self.feedCell = tableView.dequeueReusableCell(withIdentifier: self.feedCell.identifier)
as! FeedTableViewCell
self.feedCell.indexPath = indexPath
self.feedCell.delegate = self
let post = self.catPosts[indexPath.row]
self.feedCell.post = post
let aspectRatio = self.feedCell.getAspectRatioAccordingToiPhones(cellImageFrame: self.feedCell.frame.size, media: post.media!.first!)
self.feedCell.constraint_PostHeight?.update(offset: aspectRatio)
return self.feedCell
}
и внутри моей камеры у меня есть метод getAspectRadio....
:
func getAspectRatioAccordingToiPhones(cellImageFrame: CGSize, media: Media) -> CGFloat {
guard let widthNumber = NumberFormatter().number(from: catMedia.width!),
let heightNumber = NumberFormatter().number(from: catMedia.height!) else {
return UIScreen.main.bounds.width
}
let imageWidth = CGFloat(truncating: widthNumber)
let imageHeight = CGFloat(truncating: heightNumber)
let widthOffset = imageWidth - cellImageFrame.width
let widthOffsetPercentage = (widthOffset * 100) / imageWidth
let heightOffset = (widthOffsetPercentage * imageHeight) / 100
let effectiveHeight = imageHeight - heightOffset
return effectiveHeight
}
Надеюсь, это поможет тебе сейчас :) Удачи!