UITableView неправильно рисует ячейки при начальной загрузке - Swift - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть табличное представление, которое находится в файле пера, и оно загружает данные должным образом.Он загружает необходимое количество ячеек и корректно заполняет данные.Ячейка также представляет собой файл XIB, который включает в себя несколько представлений.Каждая ячейка имеет собственную высоту.Мне удалось установить правильную высоту для каждой ячейки, используя:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return (data[indexPath.row].height + 200)
}

Проблема в том, что при начальной загрузке ячейки не отрисовываются должным образом, например: Изображение начальной загрузки

Область описания не перемещается туда, где я ее перемещал, изменяя ее координаты X и Y.

Однако это исправляется, когда я прокручиваю табличное представление за пределами первоначально загруженных ячеек и возвращаюсь к ним,вот так: После прокрутки

После загрузки ячейки я перемещаю область описания под изображением.Это работает для ячеек, но не для изначально загруженных.Это исправляется только после того, как я прокручиваю разбитые клетки и возвращаюсь к ним.Как это исправить?Как я могу сделать так, чтобы ячейки правильно отображались при начальной загрузке?

Редактировать: Для пояснения: ячейки загружаются правильно, но отображаются неправильно.Я должен прокрутить первые несколько ячеек и вернуться к ним, чтобы ячейки были нарисованы правильно.

Любая помощь приветствуется.Спасибо!

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

вы хотите увеличить UITableViewCell высоту, основываясь на изображении внутри него, верно?

Вот источник данных таблицы делегата и делегат.

расширение MyDataSource: UITableViewDelegate, UITableViewDataSource {

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if let height = self.rowHeights[indexPath.row] {
        return height
    } else {
        return 100
    }
}

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    if let height = self.rowHeights[indexPath.row] {
        return height
    } else {
        return 100
    }
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return mydatas.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let mydata = mydatas[indexPath.row]

    var cell: UITableViewCell
    cell = tableView.dequeueReusableCell(withIdentifier: 'myCell.cellIdentify()')!
    cell.contentView.backgroundColor = UIColor.clear
    cell.backgroundColor = UIColor.clear
    cell.tag = indexPath.row
    cell.selectionStyle = .none

    let image = UIImage(named: promotion)
    (cell as! myCell).configureCell(downloadImage: image!)
    let aspectRatio = (image?.size.height)!/(image?.size.width)!
    let imageHeight = (cell.contentView.frame.width * aspectRatio) + 16

    UIView.performWithoutAnimation {
        self.myTableView?.beginUpdates()
        self.rowHeights[indexPath.row] = imageHeight
        self.myTableView?.endUpdates()
    }

    return cell
}

}

здесь UITableViewCell пользовательский класс.

myCell

import UIKit

class myCell: UITableViewCell {

    @IBOutlet weak var imageHolder: WMView!
    @IBOutlet weak var actionImage: UIImageView!
    @IBOutlet weak var loaderIndicator: UIActivityIndicatorView!

    override func prepareForReuse() {
        super.prepareForReuse()
        self.loaderIndicator.isHidden = false
        self.loaderIndicator.startAnimating()
        self.actionImage.image = nil
    }

    static func cellHeight() -> CGFloat {
        return 73.0
    }

    static func cellIdentify() ->String {
        return "myCell"
    }

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }

    func configureCell(downloadImage: UIImage) {
        self.imageHolder.layer.borderWidth = 1
        self.imageHolder.layer.cornerRadius = 5
        self.imageHolder.layer.borderColor = UIColor.clear.cgColor

        self.imageHolder.layer.masksToBounds = true
        self.imageHolder.clipsToBounds = true

        //ImageHolder
        self.actionImage.image = downloadImage
        self.loaderIndicator.isHidden = true
    }
}
0 голосов
/ 17 декабря 2018

Я вижу, что изображение, которое вы пытаетесь загрузить, имеет больший размер, чем изображение в контейнере изображений.Вы можете попробовать дать clipsToBound = True для imageView.

Это, скорее всего, решит вашу проблему.Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...