2015-09-25 4 views
0

У меня есть контроллер представления, который имеет tableView, а tableView имеет много ячеек.Обновление атрибутаText UITextView в UITableViewCell является laggy

class TimelineCell: UITableViewCell { 
    @IBOutlet weak var photo: UIImageView! 
    @IBOutlet weak var message: UITextView! 
} 

class TimelineViewController: UIViewController, UITableViewDataSource { 
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let entity = tableViewData[indexPath.row] 

     let cell: TimelineCell = tableView.dequeueReusableCellWithIdentifier(CellIdentifier, forIndexPath: indexPath) as! TimelineCell 
     let messageAttributedString = entity.messageAttributedString 
     cell.message.attributedText = messageAttributedString 
     return cell 
    } 
} 

Если длина messageAttributedString слишком длинная и высота cell.message слишком длинная, Tableview является лагом при прокрутке. Если я удалю обновление атрибута codeText, прокрутка будет гладкой.

Любая идея для решения этой проблемы?

Я пробовал UILabel, и проблема все еще существовала.
Могу ли я обновить атрибутText в фоновом потоке? Думаю, я не могу.

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

+0

В качестве быстрого теста попробуйте установить 'cell.contentView.layer.shouldRasterize = true'. http://stackoverflow.com/questions/19405741/when-should-i-set-layer-shouldrasterize-to-yes. Если вы видите дисплей менее резким, вы также можете изменить свой код, чтобы устанавливать его только для ячеек при прокрутке для повышения производительности, но когда прокрутка останавливается, найдите способ снова установить его на «false». –

ответ

1

Это нормальная практика (конвертировать в UIImage), поскольку даже Apple предоставляет такую ​​вещь, как shouldRasterize, которая может использоваться с UITableViewCell. Также нет ничего преступного в рендеринге атрибутаString в фоновом режиме. Вы даже можете подготовить целые объекты ячеек таблицы, сохранить их в стек, а затем вернуть их из cellForRawAtIndexPath.

Все возможные решения приемлемы для обеспечения наилучшего удобства пользователей.