Рендеринг Длинного Документа о iPad

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

1) Основное моделирование обогащенного текста: управление слева/справа полей. Управление имени шрифта, размера, переднего плана/цвета фона и межстрочного интервала. Полужирный, курсив, подчеркивание, и т.д.

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

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

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

Таким образом, я начал работать над подходом JavaScript, фальсифицируя поведение текстового выбора устройства с помощью JQuery для захвата сенсорных событий и динамично изменив DOM для изменения цвета фона выбранных регионов текста. Я создал поддельное управление UIMenuController как скрытый DIV, расположив его и отображение его каждый раз, когда был активный регион выбора.

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

Основная проблема состоит в том, что это - SLOOOOOOOW. Просмотр документа хорош и быстр, но динамично изменение DOM не является очень мгновенным. Плюс, я не мог выяснить, как воссоздать лупу усилителя, таким образом, мой поддельный текстовый выбор GUI не смотрит вполне то же как собственная реализация. Кроме того, я еще не реализовал коммуникационный мост между уровнем JavaScript и объективным-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 действительно сосет?

Во всяком случае, спасибо за Вашу справку!

7
задан benjismith 13 June 2010 в 20:18
поделиться

4 ответа

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

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

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

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

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

1
ответ дан 7 December 2019 в 14:29
поделиться

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

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

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

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

2
ответ дан 7 December 2019 в 14:29
поделиться

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

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

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

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

1
ответ дан 7 December 2019 в 14:29
поделиться

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

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

Используя JavaScript, мы можем вычислить, сколько слов помещается в div без прокрутки.

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

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

0
ответ дан 7 December 2019 в 14:29
поделиться