Seitenweise PDF

PDF Dateien können in iOS bequem in einem UIWebView angezeigt werden. Die Seiten werden darin einzeln, mit Abständen untereinander und zum Rand hin dargestellt und man kann vertikal durch die Datei scrollen. Aber was wenn man nur seitenweise blättern erlauben möchte?

Beim eingebetteten UIScrollView einfach die Property -pagingEnabled auf YES reicht leider nicht aus.

Dann passiert bei einem bildschirmfüllenden UIScrollView von 1024 x 768 Punkten mit einem PDF im Format 1024 x 768 Pixel nach ein paar mal Blättern nämlich folgendes:

Der -contentOffset im UIScrollView passt nicht mehr zur internen Seitenaufteilung durch den UIWebView. Laut Apples UIScrollView Class Reference hat die Property -pagingEnabled folgende Funktion:

If the value of this property is YES, the scroll view stops on multiples of the scroll view’s bounds when the user scrolls. The default value is NO.

Da der UIWebView und damit auch der eingebettete UIScrollView bildschirmfüllend 1024 x 768 Punkte groß ist, wird jeweils um 768 Punkte vertikal geblättert, d.h. contentOffset.y nimmt ganzzahlige Vielfache von 768.0 an.

Wegen der zwischen und am Rand der PDF-Seiten eingefügten Abstände müssen die Seitenrahmen jedoch proportional skaliert werden. 7 Punkte Rand links und rechts ergeben eine Breite von 1010 Punkten. Eine 1024 x 768 Pixel PDF-Seite wird damit im Format 1010 x 758 dargestellt:

Oberhalb der ersten Seite und zwischen aufeinanderfolgenden Seiten beträgt der Abstand ebenfalls 7 Punkte.

Passt man nun das Format der PDF-Seiten auf 1010 x 761 Pixel an, so ergibt sich für den Seitenrahmen im UIWebView eine Größe von 1024 x 768 Punkten inklusive 7 Punkt breiten Rändern. Die Seitenaufteilung passt damit genau zur vertikalen Größe des UIScrollViews und das Blättern mit einem Vielfachen von 768.0 trifft genau die PDF-Seiten.

Selbst nach fast 30 Seiten gibt es keine Abweichung:

Voilà!

← Pässe selber machen StackedViewController →