Почему мои ячейки таблицы не имеют правильного размера при наличии изображения? - PullRequest
1 голос
/ 05 июня 2019

Я настраиваю табличное представление в стиле «новостной ленты» и хотел бы, чтобы мои пользовательские ячейки автоматически изменяли размер на основе двух факторов:

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
        }
    }
}

1 Ответ

0 голосов
/ 05 июня 2019

Если ваши ячейки имеют более одного уникального макета, каждый уникальный макет должен получить свой собственный идентификатор повторного использования (а лучше - собственный подкласс).

Создание двух подклассов ячеек - один только для текста, второй для ячейки с изображением

Измените func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell на что-то похожее:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let isCellHasImage: Bool = // understand if it will image cell or just text cell

    if (isCellHasImage) {
        // dequeue and return your image cell
        // return cell
    }

    // dequeue and return your text-only cell
    // ...
    // return cell
}
...