Проблема производительности прокрутки с UItextView с большой NSAttributedString

Я работаю над текстовым редактором для приложения. Я использую UITextView

См. пример кода для загрузки текстового представления.

// Read text from file (around 300k - 400k words)
NSError *error = nil;
NSString *contentOfFile = [[NSString alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"17254" ofType:@"txt"]
                                                          encoding:NSUTF8StringEncoding
                                                             error:&error];

// Attributes for text
UIFont *font = [UIFont fontWithName:@"Baskerville" size:36.0f];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.alignment = NSTextAlignmentJustified;

NSDictionary *attributes = [[NSDictionary alloc] initWithObjectsAndKeys:font, NSFontAttributeName,
                            [UIColor blackColor], NSForegroundColorAttributeName,
                            paragraphStyle, NSParagraphStyleAttributeName, nil];


// Create attributed string
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:contentOfFile attributes:attributes];

// Assign to text view
self.textView.attributedText = attributedString;

Размер текста около 400к слов.

Я сталкиваюсь со следующими проблемами.

  • Прокрутка текста становится слишком медленной, когда я прокручиваю вниз, и иногда приложение вылетает из-за проблем с памятью. Я думаю, что iOS сохраняет отображаемое текстовое изображение в своей памяти, когда текстовое представление прокручивается вниз, но когда я прокручиваю вверх, оно освобождает память.

  • Если я нажму «Выбрать все», выделение текста займет слишком много времени, и после выбора текста прокрутка станет плохой, и иногда приложение вылетает из-за проблемы с памятью, потому что его память увеличивается. Я думаю, что iOS генерирует изображение полного текста (как если бы он был виден пользователю) в своей памяти, а затем выбирает полный текст и сохраняет его изображение до тех пор, пока выбор не будет завершен. После завершения выбора память сохраняется приложениями.

Другой способ отображения большого текста - использовать несколько текстовых представлений и назначать текст видимому текстовому представлению только как UITableView, но это увеличит сложность, поскольку мне придется пересчитывать количество текстовых представлений, необходимых для каждого вызова делегата textChanged layoutManager из UItextView .

Любой орган знает, как отображать большой текст с атрибутами в UITextView с большей производительностью.

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


person umair.saeed    schedule 18.02.2014    source источник
comment
Pages использует полностью настраиваемое представление... Если вы просто показываете текст, вы можете использовать UIWebView... Просто оберните текст в некоторые HTML-теги для форматирования, а затем отобразите его таким образом.   -  person jjv360    schedule 18.02.2014
comment
Это редактор. Пользователь может редактировать шрифт, цвет и выравнивание. Можно добавить разрывы страниц и некоторые другие параметры.   -  person umair.saeed    schedule 18.02.2014


Ответы (1)


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

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

person Apurv    schedule 18.02.2014
comment
У меня та же проблема. Можете ли вы уточнить свой ответ больше. - person Husein Behboudi Rad; 29.06.2014
comment
Пожалуйста, сделайте свой ответ более понятным с примером - на данный момент это немного сбивает с толку. - person hansmbakker; 29.06.2018