В последнее время появилось много вопросов о рисовании PDF-файлов.
Да, вы можете отображать PDF ' очень легко с UIWebView
, но это не может обеспечить производительность и функциональность, которые вы ожидаете от хорошей программы просмотра PDF.
Вы можете нарисовать страницу PDF в CALayer или к UIImage . У Apple даже есть образец кода, чтобы показать, как нарисовать большой PDF-файл в масштабируемом UIScrollview
, но те же проблемы продолжают возникать.
Метод UIImage:
UIImage
don не оптически
масштабируемость, а также подход слоев. UIImages
из PDFcontext
ограничивает / предотвращает его использование для создания
рендеринг новых уровней масштабирования в реальном времени. CATiledLayer Method:
CALayer
: отдельные тайлы можно увидеть при рендеринге (даже с настройкой tileSize) CALayers
не могут быть подготовлены заранее
времени (отображается за пределами экрана). Как правило, программы просмотра PDF также занимают много памяти. Даже отслеживайте использование памяти в примере Apple с масштабируемым PDF-файлом.
В моем текущем проекте я разрабатываю программу просмотра PDF-файлов и визуализирую UIImage
страницы в отдельном потоке (здесь тоже есть проблемы!) и представляя его в масштабе x1. CATiledLayer
срабатывает, когда масштаб> 1. iBooks использует аналогичный двойной подход: если вы прокручиваете страницы, вы можете увидеть версию страницы с более низким разрешением менее чем за секунду до появления четкой версии.
Я визуализирую 2 страницы с каждой стороны страницы в фокусе, поэтому что PDF-изображение готово замаскировать слой перед тем, как начать рисование. Страницы снова уничтожаются, когда они находятся на +2 страницах от выбранной страницы.
Есть ли у кого-нибудь какие-либо идеи, независимо от того, насколько малы или очевидны для улучшения производительности / обработки памяти файлов PDF для рисования? или какие-либо другие вопросы, обсуждаемые здесь?
РЕДАКТИРОВАТЬ: Некоторые советы (Фото: Люк Макнейс, VdesmedT, Мэтт Галлахер, Йоханн):
Сохраняйте любые носители на диск, когда можете.
Используйте плитки большего размера, если рендеринг на TiledLayers
init часто используемые массивы с объектами-заполнителями, альтернативно другой подход к проектированию - этот
Обратите внимание, что изображения будут отображаться быстрее, чем CGPDFPageRef
Используйте NSOperations
или GCD & Блоки для подготовки страниц вперед
времени.
call CGContextSetInterpolationQuality (ctx, kCGInterpolationHigh); CGContextSetRenderingIntent (ctx, kCGRenderingIntentDefault);
до CGContextDrawPDFPage
, чтобы уменьшить использование памяти при отрисовке
инициализации ваших NSOperations
с плохой идеей docRef (docRef). docRef в одноэлемент.
Отменить ненужные NSOperations
Когда вы можете, особенно если они будут использовать память, остерегайтесь оставлять контексты открытыми!
Переработайте объекты страницы и уничтожьте неиспользуемые представления
Закройте все открытые контексты, как только они вам не понадобятся
при получении предупреждений об освобождении памяти и перезагрузите DocRef и все кеши страниц
Другие возможности PDF: После перехода к окну добавления вложения и возврата назад вертикальная полоса прокрутки проходит за нижний край ... У меня проблема с вертикальной полосой прокрутки в настраиваемой форме списка SharePoint в IE. После перехода к окну добавления вложения и возврата назад вертикальная полоса прокрутки проходит за нижний край окна , так что невозможно прокрутить до самого низа формы. Изменение размера окна решает эту проблему, поэтому возможно, если бы я мог каким-то образом заставить окно пересчитывать полосу прокрутки из javascript без изменения размера окна, это было бы простым обходным решением. Можно ли запустить такое «изменение размера» и как? Также приветствуются любые другие решения этой конкретной проблемы. Спасибо!