Я настраиваю табличное представление в стиле «новостной ленты» и хотел бы, чтобы мои пользовательские ячейки автоматически изменяли размер на основе двух факторов:
1) Независимо от того, содержит ли представленный пост изображение - если это не так, ячейка должна вести себя так, как там, хотя отсутствует ImageView и размер соответственно
2) Если сообщение содержит изображение, ImageView должен установить его высоту в соответствии с высотой изображения (следовательно, нет ограничения по высоте для ImageView), и ячейка должна соответственно изменить размер
Я получаю крайне странное поведение от своих камер, пытаясь достичь этого. Первоначально первая ячейка с изображением будет заполнена правильно. Однако при прокрутке изображения начинают неправильно отображаться, а другие вообще не отображаются.
Мои изображения загружаются асинхронно через Google Firebase.
Я использую Autolayout в своей ячейке, и для всех подпредставлений правильно установлены ограничения top, bottom, лид и трейлинг. Проблема, кажется, ограничивается только ImageView. Другие элементы не затрагиваются.
Я попытался установить ограничение высоты для ImageView и программно изменить его размер в зависимости от того, должно ли изображение появляться. Это, похоже, не помогает.
Вот мои методы делегата табличного представления:
// Tableview methods
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return mPosts!.count
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return 600
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = newsfeed.dequeueReusableCell(withIdentifier: "newsfeedCell") as! NewsfeedCell
let post = mPosts![indexPath.row]
cell.posterNameDisplay.text = post.getPosterName() + " " + (mAccount?.getFamilyName())!
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMMM dd, yyyy @ hh:mm a"
let dateString = dateFormatter.string(from: post.getTimeStamp())
cell.timestampDisplay.text = dateString
cell.postMessageDisplay.text = post.getPostMessage()
AccountUtils.loadProfilePhoto(ProfileId: post.getPosterId(), ProfilePhoto: cell.profilePhoto)
cell.profilePhoto.layer.borderWidth = 1.0
cell.profilePhoto.layer.masksToBounds = false
cell.profilePhoto.layer.borderColor = UIColor.white.cgColor
cell.profilePhoto.layer.cornerRadius = cell.profilePhoto.frame.size.width / 2
cell.profilePhoto.clipsToBounds = true
PostUtils.loadPostImage(View: cell.postImage, PostId: post.getPostId())
return cell
}
А вот метод утилиты, который я использую для загрузки и установки изображения в ImageView:
public static func loadPostImage(View postImage: UIImageView, PostId postId: String) {
let storage = Storage.storage()
let storageRef = storage.reference()
let photoRef = storageRef.child("photos/" + Auth.auth().currentUser!.uid + postId + ".jpg")
photoRef.getData(maxSize: 1 * 1024 * 1024) { data, error in
if error != nil {
postImage.image = nil
}
else {
let image = UIImage(data: data!)
postImage.image = image
}
}
}