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