Swift UITableView отстает от изображений

Я хотел бы показывать изображения в TableView, поэтому я создал пользовательскую ячейку

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->
    UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as TableViewCell

    if let image =  UIImage(data: self.photos[indexPath.row].image) {

        if image.size.width > image.size.height {

            tableView.rowHeight = view.bounds.width *  0.71

        } else { tableView.rowHeight = view.bounds.width *  1.22

        }

        cell.cellImage.image = image
    }

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

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

Кто-нибудь знает, как сделать его гладким в Swift?


person chrisco    schedule 23.12.2014    source источник


Ответы (1)


Во-первых, вы никогда не должны изменять высоту строк в середине создания ячеек таблицы. Изменение высоты строки очень дорого обходится UITableView. Вы должны использовать UITableViewDelegate метод tableView(heightForRowAtIndexPath:), чтобы сообщить представлению таблицы, какой должна быть высота каждой ячейки. Это почти наверняка ваша главная проблема.

Меньшая проблема заключается в том, что создание UIImage из данных довольно дорого, и вы продолжаете создавать новые изображения, а затем выбрасывать их.

Решение обоих из них простое. Создайте все свои изображения один раз и поместите их в свою модель. Тогда tableView(cellForWRowAtIndexPath:) можно просто присвоить уже созданное изображение изображению, а tableView(heightForRowAtIndexPath:) реализовать тривиально.

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

person Rob Napier    schedule 23.12.2014
comment
основная проблема была с UIImage - когда я создаю их один раз в начале загрузки намного быстрее. Но у меня все еще есть лаги при прокрутке вниз - я переместил создание ячейки в heightForRowAtIndexPath: let image = self.photosTemp[indexPath.row].image if image.size.width › image.size.height { return view.bounds.width * 0,71 } еще { вернуть view.bounds.width * 1,22 } - person chrisco; 08.01.2015
comment
creating a UIImage from data is somewhat expensive это спасло меня! - person Brian; 28.05.2015