iPhone OS 3.2; PDF рендеринг; Взаимодействие с пользователем - PullRequest
4 голосов
/ 26 мая 2010

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

В настоящее время я думаю, что могу сделать это либо с:

A. UIWebView

Прекрасно отображает PDF, прокрутка и масштабирование. Но похоже, что реализовать интерактивные части PDF-файла очень сложно.

  1. Я не знаю, смогу ли я использовать CGPDFContextSetURLForRect
  2. Получение сенсорных событий из UIWebView для выполнения чего-то вроде CGPDFContextSetURLForRect, на мой взгляд, выглядит как "довольно плохой" взлом. Смотри: http://github.com/psychs/iphone-samples/blob/master/WebViewTappingHack/Classes/PSWebView.m

B. Кварц

Я нашел несколько ресурсов, описывающих, как отображать PDF напрямую через Quartz. См: http://developer.apple.com/iphone/library/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_pdf/dq_pdf.html

  1. Это позволит использовать CGPDFContextSetURLForRect
  2. Но я понятия не имею, поддерживает ли это, например, UIWebView, прокрутку и масштабирование из коробки?

Кто-нибудь может просветить меня об этом, пожалуйста?

Спасибо за ваше время!

[Редактировать: изменено 3,0 на 3,2] [Редактировать: мое «решение»]

Привет!

Я мог бы придумать рабочую реализацию для PNG, но не для PDF.

[Abstract] Мое решение заключалось в рендеринге контента, перехвате касаний к нему, получении координат относительно отображаемого контента, если он выполняется одним касанием, и, наконец, поиске того, что делать из отображения, содержащего интерактивные области в качестве координат, и что делать, если на них нажимали .

[Для PNG] Реализовать что-то подобное было бы гораздо более обременительно, чем я мог себе представить ... И реализация, с которой я работал, сильно зависит от контента, который вы хотите отобразить, потому что он работает для UIImageView, но я не мог заставить его работать с UIWebView.

Сначала вам понадобятся UIScrollView и UIImageView для визуализации содержимого и поддержки прокрутки / масштабирования. Затем вам нужно реализовать некоторую обработку, чтобы получить интересующие вас прикосновения / жесты. См .: developer.apple.com/iphone/library/samplecode/ScrollViewSuite/Listings/1_TapToZoom_Classes_TapDetectingImageView_h.html

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

[Для PDF] Если вы хотите сделать это с PDF, первым делом вам нужно использовать UIWebView (возможно, вы могли бы сделать это через Quartz или что-то еще)

Получение прикосновений с помощью UIWebView - это настоящая боль! Есть много способов, предлагаемых в Интернете, и, кроме того, никто не сделал то, что он должен делать. После нескольких дней поисков я нашел этот драгоценный камень: cocoawithlove.com/2009/05/intercepting-status-bar-touches-on.html

Итак ... создание подклассов UIWebView никуда не приведет, в отличие от UIImageView, и вы должны создать подкласс UIApplicationMain и реализовать его метод для обработки сенсорных событий. Здесь вы можете использовать некоторые из «Touch-Handling-Stuff» из Apple-экзамена сверху.

Теперь вам нужно будет перевести координаты касания в ваш контент, если он масштабируется / прокручивается. UIWebView НЕ делает этого за вас, в отличие от UIImageView!

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

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

1 Ответ

0 голосов
/ 27 сентября 2010

Использование операторов CGPDF * позволит вам написать UIPDFView, который работает точно так же, как UIImageView, но использует PDF в качестве исходного изображения. Создайте свой собственный подкласс UIView и реализуйте drawRect: для вызова CGContextDrawPDFPage. Основываясь на быстром поиске в Google (потому что я знаю ключевые слова), эта страница , кажется, достаточно хорошо объясняет эту сторону.

Затем вы можете напрямую заменить свой пользовательский подкласс UIView на UIImageView и действовать точно так же, как и в случае решения PNG.

...