Рендеринг длинного документа на iPad - PullRequest
7 голосов
/ 13 июня 2010

Я реализую средство просмотра документов с возможностью выделения / аннотации для пользовательского формата документов на iPad.Документы довольно длинные (от 100 до 200 страниц, если напечатаны на бумаге), и мне было трудно найти правильный подход.Вот требования:

1) Базовое форматирование с расширенным текстом: контроль левого / правого поля.Управление именем шрифта, размером, цветом переднего плана / фона и межстрочным интервалом.Жирный, курсив, подчеркивание и т. Д.

2) Выделение и выделение произвольных областей текста (не ограниченных границами абзаца, как в Safari / UIWebView).

3) Настройка обрезки /Всплывающее окно копирования / вставки (UIMenuController) Это одно из основных требований приложения.

Моя первая реализация была основана на UIWebView.Я только что представил документ как HTML с CSS для стилизации текста.Но я не смог получить желаемое поведение для выделения текста (через границы абзаца), и UIMenuController не может быть настроен из UIWebView.

Поэтому я начал работать над подходом javascript, подделывая текст устройства-выбор поведения с использованием JQuery для перехвата сенсорных событий и динамического изменения DOM для изменения цвета фона выделенных областей текста.Я создал фальшивый элемент управления UIMenuController как скрытый DIV, позиционируя и скрывая его, когда была активная область выделения.

Не слишком потертый.

Основная проблема в том, что это SLOOOOOOOW.Пролистывать документ приятно и быстро, но динамическое изменение DOM не очень быстро.Кроме того, я не мог понять, как воссоздать лупу лупы, поэтому мой искусственный графический интерфейс для выделения текста не выглядит так же, как нативная реализация.Кроме того, я еще не реализовал коммуникационный мост между слоем javascript и слоем Objective-C (где живет остальная часть приложения), но это создавало огромные проблемы.

Так что яЯ смотрел на CoreText, но в Интернете есть несколько драгоценных примеров.Я потратил немного времени на эту простую небольшую демонстрацию:

http://github.com/jonasschnelli/I7CoreTextExample/

Он показывает, как использовать CoreText для рисования строки NSAttributedText в UIView.Но у него есть свои проблемы: он не реализует поведение выделения текста и не представляет UIMenuController, поэтому я не знаю, как это сделать.И, что более важно, он пытается нарисовать весь документ сразу, с существенным снижением производительности для длинных документов.Мои документы могут содержать тысячи абзацев, и на экране одновременно отображается менее 1% документа.

С другой стороны, эти документы уже содержат точную информацию о форматировании.Я знаю точное положение страницы каждой строки текста, поэтому мне не нужен механизм верстки.

Кто-нибудь знает, как реализовать такой вид представления с помощью CoreText?Я понимаю, что полноценная реализация является излишним для такого вопроса, но я ищу хороший пример CoreText с несколькими основными требованиями:

1) Точное управление макетом и форматированием (с использованием метрик форматированияи стили текста, которые я уже рассчитал).

2) Произвольный выбор текста.

3) Настройка UIMenuController.

4) Эффективная переработка ресурсов для выключенияэкранные объекты.

Я был бы рад реализовать свою собственную переработку, когда текстовые элементы прокручиваются вне экрана, но разве это не потребовало бы повторной реализации UIScrollView?

Я - брендновичок в разработке для iPhone и все еще привыкаю к ​​Objective-C, но я работаю на других языках (Java, C #, flex / actionscript и т. д.) уже более десяти лет, поэтому я уверен в своей способности получитьпроделанная работа, если бы я только лучше почувствовал iPhone SDK и общие шаблоны кодирования для подобных вещей.Это только у меня, или документация SDK действительно отстой?

В любом случае, спасибо за вашу помощь!

Ответы [ 4 ]

2 голосов
/ 14 июня 2010

Есть ли в вашем документе какие-либо семантические компоненты, кроме каждого абзаца? Если у вас уже есть какая-то концепция разделов или страниц, я бы порекомендовал вам представить каждый из них в качестве независимой табличной ячейки. Довольно просто создать табличную ячейку, которая заставит вас забыть, что вы на самом деле смотрите на UITableView. Все, что вам нужно сделать, это переопределить drawRect: и setSelected: и setHighlighted: и тах да! Нет больше ячейки делителей , если вы не хотите их. Кроме того, вы можете сделать некоторые изящные вещи, используя табличное представление в качестве своей базы. Если бы вы определили разделы в UITableView, то у вас мог бы быть отличный заголовок, который прокручивается по мере пролистывания документа. Другая вещь, которую вы могли бы сделать, это добавить панель «Перейти к разделу» / меню закладок, и таким образом вам не нужно предоставлять выбор между границами разделов.

Массивные блоки копирования-вставки также были бы довольно болезненными для системы. Кроме того, если у вас возникли проблемы с предоставлением этого контента, вы, возможно, не захотите сделать так, чтобы кто-то слишком быстро скопировал все это сразу ... (Не могу больше следовать этой точке зрения без дополнительной информации о вашем проекте).

Если вы действительно хотите предоставить параметры копирования и вставки, вы можете добавить кнопки для каждой логической страницы или раздела, которые сразу же выбирают и копируют весь раздел для удобства пользователя. (Может быть с цитатой связано?)

Я рекомендую вам найти UITableViewCell UITableViewDelegate и UITableViewDataSource в документах SDK, поскольку эти страницы значительно помогут, если вы решите использовать это предложение.

1 голос
/ 14 июня 2010

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

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

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

Или, возможно, я мог бы отобразить каждую страницу документа (как обычный PDF, это формат постраничного документа) в качестве ячейки таблицы и переопределить графический элемент-разделитель ячеек, чтобы он выглядел как граница страницы ...

Но можно ли было бы избавиться от поведения касания по умолчанию в таблице и вместо этого реализовать текстовыйвыделение на ячейке таблицы содержимого?Было бы совершенно невозможно реализовать выделение текста, которое пересекает границы абзаца (между несколькими ячейками таблицы)?

1 голос
/ 13 июня 2010

Всего два случайных наблюдения:

  • Можете ли вы позволить себе создать пейджинговый интерфейс?(В отличие от «бесконечной прокрутки».) Похоже, интерфейс подкачки будет намного проще для системных ресурсов.

  • UIActionBar на самом деле UIMenuController класс.Интерфейс немного странный, так как меню одноэлементное (wtf?), Но я уверен, что у вас не возникнет проблем с его выяснением.1017 *

0 голосов
/ 24 августа 2010

UIWebView - хороший выбор, но нам нужно другое приложение для точной визуализации страниц с использованием каждого шрифта и каждой таблицы стилей и сохранения отображаемой информации в таблице базы данных:

chapter_id int первичный ключ,
startlocation int,
конечное местоположение int,
fontsize int (или строка имени таблицы стилей)

Используя JavaScript, мы можем вычислить, сколько слов помещается в элемент div без прокрутки.UIWebView хорош, так как предоставляет богатый контент, имеет режим выделения и выделения.

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

...