Подтвердить что ты не робот

Как визуализировать документы большого размера в iOS?

Я работаю над проектом Reader, в настоящее время я анализирую XML файл и преобразовываю его в качестве атрибутной строки, и я визуализирую его в CoreText (используется яблочный Пример кода).

Размер файла XML превышает 6 МБ. Тексты отображаются правильно, но я не могу отображать изображения и таблицы (например, таблицы html).

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

Есть ли какая-либо другая технология для рендеринга текстов, изображений и таблиц?

P.S - Клиент не хочет UIWebView.

4b9b3361

Ответ 1

При работе с такими большими файлами вы можете отображать данные в несколько раз. Вот несколько решений:

  • Развернуть свой экран за страницей: разделить файл на 10 частей (скажем, пример) и отобразить первую часть в UITextView. Добавьте два экземпляра UIButton, чтобы читатель мог переключать страницу. При изменении страницы загрузите первую/следующую часть в свой UITextView. Это не будет особенно незнакомо для пользователей, потому что вы воспроизводите естественный способ чтения электронной книги. Чтобы определить, сколько частей вы должны разделить ваши данные, следите за тем, чтобы пользователь не хотел постоянно переключаться на страницу, вы должны отрегулировать это с вниманием.

enter image description here

  • Палировать ваш экран "плавно": вы разбиты на страницы, как описано выше, но вы всегда будете иметь дело с двумя UITextView, встроенными в ScrollView. Точно так же, как iOS повторно использует ячейки в UITableView и данные ячейки памяти по требованию (ленивая загрузка), реализуйте этот механизм многократного использования с двумя экземплярами UITextView - быстро, вы можете попробовать реализовать механизм со стандартным UITableView.

Надеюсь, это поможет!

Ответ 2

UIScrollView, вероятно, единственная возможность. Разделите свой документ на части и поместите в UIScrollView соответствующие подвидные классы UITextView, UIImageView и UITableView. Чтобы снизить влияние памяти, оставьте только те подвидные объекты, которые на самом деле видны.

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    [self removeSubViews];
    [self addSubViews];
}

- (void)removeSubViews {
    for (UIView *subView in documentScrollView.subviews) {
        [subView removeFromSuperview];
    }
}

- (void)addSubViews {
    NSArray* visibleSubViews = [self getAllSubViewsThatAreVisible];
    for (UIView *subView in visibleSubViews) {
        [documentScrollView addSubview:subView];
    }
}

- (NSArray*)getAllSubViewsThatAreVisible {
    NSMutableArray* arrayOfSubViews = [[NSMutableArray alloc] init];
    NSArray* arrayOfVisibleComponents = [self getAllVisibleComponents];
    for (NSDictionary *component in arrayOfVisibleComponents) {
        //there you have to create new UITableView, UITextView, or UIImageView according to what is needed and put this new component into arrayOfSubViews
    }
    return arrayOfSubViews;
}

- (NSArray*)getAllVisibleComponents {
//this is hard to tell how it should be written as I do not know your data. Lets assume, that you have an array of NSDictionary objects. Check all objects in this array, whether they can be visible or not. You shall know their future coordinates in scrollView, while in scrollView, you get visible part by usig property named contentOffset, which will give you top left corner coordinate and by using also property frame.size, you get whole visible rectangle
}

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

Ответ 3

Вы не разработали структуру документа, закодированного в вашем XML файле. Это может быть очень сложным с HTML-подобной иерархической структурой, или это может быть просто - линейные абзацы текста, вкрапленные изображениями и таблицами.

Предполагая последнее, мне нравятся подходы _sweepy и Reconquistador. Но я могу попробовать использовать UITableView и создавать типы ячеек для каждой конструкции документа - абзаца, изображения, таблицы. Абзац и изображение можно было бы реализовать с использованием представлений UILabel и UIImage для визуализации содержимого. Таблицы могут быть сложнее, но я бы, вероятно, использовал UIWebView или WKWebView для отображения только таблицы.

Вам нужно будет проанализировать ваш XML в какой-либо структуре или хранилище, где вы могли бы искать определенную конструкцию документа по линейному индексу. Предполагая огромный документ, я склоняюсь к SQLite или CoreData.

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