iPad PDF Reader bauen. Es wird nur die letzte Seite im PDF angezeigt

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • iPad PDF Reader bauen. Es wird nur die letzte Seite im PDF angezeigt

    Hallo zusammen,

    ich baue gerade einen PDF Reader für das iPad. Der soll ein mehrseitiges PDF darstellen, in dem geblättert & gezommt wereden kann. Ich mache das Ganze mit CGContextDrawPDFPage etc. Also nicht mit UIWebView. Den WebView will ich dazu auch nicht nutzen.

    Mit dem unteren Aufruf, wird bei mir aber nur die letzte Seite im PDF dargestellt, weil die drawLayer Methode nur die eine Seite zugewiesen bekommt. Wie kann ich der Methode denn Contextabhängig mitteilen, welche Seite sie darstellen soll?

    Quellcode

    1. @implementation PDFView2ViewController
    2. @synthesize pdfview,oneSite;
    3. const CGFloat kScrollObjHeight = 1024.0;
    4. const CGFloat kScrollObjWidth = 768.0;
    5. const NSUInteger kNumImages = 10;
    6. -(void)click:(id)sender
    7. {
    8. PDFWebViewController *viewC = [[PDFWebViewController alloc]initWithNibName:@"PDFWebView" bundle:nil];
    9. [self.view addSubview:viewC.view];
    10. }
    11. /*
    12. // The designated initializer. Override to perform setup that is required before the view is loaded.
    13. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    14. if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
    15. // Custom initialization
    16. }
    17. return self;
    18. }
    19. */
    20. /*
    21. // Implement loadView to create a view hierarchy programmatically, without using a nib.
    22. - (void)loadView {
    23. }
    24. */
    25. - (void)layoutScrollImages
    26. {
    27. UIView *view = nil;
    28. NSArray *subviews = [myContentView subviews];
    29. // reposition all image subviews in a horizontal serial fashion
    30. CGFloat curXLoc = 0;
    31. for (view in subviews)
    32. {
    33. if ([view isKindOfClass:[UIView class]] && view.tag > 0)
    34. {
    35. CGRect frame = view.frame;
    36. frame.origin = CGPointMake(curXLoc, 0);
    37. view.frame = frame;
    38. curXLoc += (kScrollObjWidth);
    39. NSLog(@"pos view %@",view);
    40. }
    41. }
    42. // set the content size so it can be scrollable
    43. [scrollView setContentSize:CGSizeMake((kNumImages * kScrollObjWidth), [scrollView bounds].size.height)];
    44. //scrollView.contentSize = pageRect.size;
    45. myContentView.frame = CGRectMake(0, 0,scrollView.contentSize.width,scrollView.contentSize.height);
    46. NSLog(@"contentSize %@",NSStringFromCGSize(scrollView.contentSize));
    47. }
    48. // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
    49. - (void)viewDidLoad {
    50. [super viewDidLoad];
    51. CFURLRef pdfURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("05_DMag1003_InterviewSpengler_RZ.pdf"), NULL, NULL);
    52. myDocumentRef = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL);
    53. NSUInteger i;
    54. CGRect pageRect;
    55. myContentView = [[UIView alloc]init];
    56. for (i = 0; i <= kNumImages; i++)
    57. {
    58. myPageRef = CGPDFDocumentGetPage(myDocumentRef, i);
    59. pageRect = CGRectIntegral(CGPDFPageGetBoxRect(myPageRef, kCGPDFCropBox));
    60. CATiledLayer *tiledLayer = [CATiledLayer layer];
    61. tiledLayer.delegate = self;
    62. tiledLayer.tileSize = CGSizeMake(1024.0, 1024.0);
    63. tiledLayer.levelsOfDetail = 1000;
    64. tiledLayer.levelsOfDetailBias = 1000;
    65. tiledLayer.frame = pageRect;
    66. /// Hier wird das PDF direkt in den View geschrieben. Funkt bedingt, weil unten die drawLayer Methode
    67. /// nur die letzte Seite des PDFs aufruft
    68. UIView *theContentView = [[UIView alloc] initWithFrame:pageRect];
    69. theContentView.tag = i;
    70. theContentView.backgroundColor = [UIColor yellowColor];
    71. [theContentView.layer addSublayer:tiledLayer];
    72. [myContentView addSubview:theContentView];
    73. [theContentView release];
    74. }
    75. CGRect viewFrame = self.view.frame;
    76. viewFrame.origin = CGPointZero;
    77. //scrollView = [[UIScrollView alloc] initWithFrame:viewFrame];
    78. scrollView.delegate = self;
    79. //scrollView.contentSize = pageRect.size;
    80. myContentView.frame = pageRect;
    81. scrollView.maximumZoomScale = 5;
    82. [scrollView setCanCancelContentTouches:NO];
    83. scrollView.clipsToBounds = NO; // default is NO, we want to restrict drawing within our scrollview
    84. scrollView.scrollEnabled = YES;
    85. scrollView.bouncesZoom = YES;
    86. scrollView.pagingEnabled = YES;
    87. scrollView.backgroundColor = [UIColor grayColor];
    88. [self layoutScrollImages];
    89. [scrollView addSubview:myContentView];
    90. }
    91. - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
    92. {
    93. //NSLog(@"scrollView");
    94. // größe des contents im scroll view an myContentView anpassen //
    95. myContentView.frame = CGRectMake(0, 0,scrollView.contentSize.width,scrollView.contentSize.height);
    96. return myContentView;
    97. }
    98. - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
    99. {
    100. CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0);
    101. CGContextFillRect(ctx, CGContextGetClipBoundingBox(ctx));
    102. CGContextTranslateCTM(ctx, 0.0, layer.bounds.size.height);
    103. CGContextScaleCTM(ctx, 1.0, -1.0);
    104. // Hier ist page immer nur eine feste Zahl. Diese müsste irgendwie contextabhängig sein
    105. CGContextConcatCTM(ctx, CGPDFPageGetDrawingTransform(CGPDFDocumentGetPage(myDocumentRef, page), kCGPDFCropBox, layer.bounds, 0, true));
    106. CGContextDrawPDFPage(ctx, CGPDFDocumentGetPage(myDocumentRef, page));
    107. }
    108. #pragma mark UIScrollView delegate methods
    109. // Override to allow orientations other than the default portrait orientation.
    110. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    111. return YES;
    112. }
    113. - (void)didReceiveMemoryWarning {
    114. // Releases the view if it doesn't have a superview.
    115. [super didReceiveMemoryWarning];
    116. // Release any cached data, images, etc that aren't in use.
    117. }
    118. - (void)viewDidUnload {
    119. // Release any retained subviews of the main view.
    120. // e.g. self.myOutlet = nil;
    121. }
    122. - (void)dealloc {
    123. [super dealloc];
    124. [pdfview release];
    125. [oneSite release];
    126. }
    127. @end
    Alles anzeigen


    Danke schon mal :)
  • macmoonshine schrieb:

    Mit der Variable page wählst Du ja die Seite aus. Wie setzt Du die Variable denn?

    Vielleicht ist es günstiger, für jede Seite aus dem PDF-Dokument einen eigenen View zu haben. Das könntest Du mit einer Unterklasse von UIView machen.

    Habe auch schon probiert aus jeder Seite einen eigenen View zu machen. Aber dann kann ich den View nicht dazu bewegen drawLayer neu aufzurufen, wenn ich den "MutterView" zoome.
    [setNeedsDisplay] hat da leider auch nicht geholfen
  • Jeder Layer von jedem Deiner 'contentView' weist Du denselben 'delegate' zum Zeichnen zu, mit dem Ergebnis, dass sich alle Layer dann zum Zeichnen auf ihn stürzen und leider nur immer die Seite mit der Nummer von 'page' zeichnen können.
    Du musst eine Möglichkeit finden, die Layer entsprechend der Seite in der Zeichenmethode zu identifizieren, entweder benennst Du die Layer, oder Du suchst irgendwie mit '"indexOfObject:" nach Ihnen.
    Dann kannst Du an dem Layer-Konzept festhalten.
    I would be embarrassed if they did not spy on me.
  • macmoonshine schrieb:

    cuSoon schrieb:

    [setNeedsDisplay] hat da leider auch nicht geholfen

    Wenn Du das Zeichnen in der Methode drawRect: implementierst und für jeden PFD-View setNeedsDisplay einzeln aufrufst, sollte es gehen.

    longW schrieb:

    Du musst eine Möglichkeit finden, die Layer entsprechend der Seite in der Zeichenmethode zu identifizieren, entweder benennst Du die Layer, oder Du suchst irgendwie mit '"indexOfObject:" nach Ihnen.
    Dann kannst Du an dem Layer-Konzept festhalten.
    Danke für die Antwort. Kannst du mir ein Bsp geben, wie ich die Layer benenne & dann ansprechen kann?
  • Nümmerchen

    In Deiner Schleife formulierst Du irgendwie:

    Quellcode

    1. tiledLayer.name = @"Nümmerchen";

    Und in der Zeichenmethode:

    Quellcode

    1. if([tiledLayer.name isEqualTostring: @"Nümmerchen"])

    …(zeichne die Seite mit page = Nümmerchen)

    Wie Du das im Detail löst, liegt an Dir. Ich würde einen Zahlenwert in die Zeichenkette packen und mir mit 'intValue' wieder heraus holen.
    I would be embarrassed if they did not spy on me.