Skip to content

Commit

Permalink
fix iPad zoom problem
Browse files Browse the repository at this point in the history
  • Loading branch information
Wonday committed Jun 5, 2018
1 parent c11f765 commit ace3f45
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 35 deletions.
19 changes: 10 additions & 9 deletions PdfView.js
Expand Up @@ -43,7 +43,7 @@ export default class PdfView extends Component {
scale: 1,
spacing: 10,
style: {},
fitPolicy: 0,
fitPolicy: 2,
horizontal: false,
page: 1,
currentPage: -1,
Expand All @@ -63,6 +63,7 @@ export default class PdfView extends Component {
page: -1,
currentPage: -1,
pageAspectRate: 0.5,
pdfPageSize: {width: 0, height: 0},
contentContainerSize: {width: 0, height: 0},
scale: this.props.scale,
contentOffset: {x: 0, y: 0},
Expand All @@ -88,7 +89,8 @@ export default class PdfView extends Component {
pdfLoaded: true,
fileNo: pdfInfo[0],
numberOfPages: pdfInfo[1],
pageAspectRate: pdfInfo[3] === 0 ? 1 : pdfInfo[2] / pdfInfo[3]
pageAspectRate: pdfInfo[3] === 0 ? 1 : pdfInfo[2] / pdfInfo[3],
pdfPageSize: {width: pdfInfo[2], height: pdfInfo[3]}
});
if (this.props.onLoadComplete) this.props.onLoadComplete(pdfInfo[1], this.props.path);
}
Expand Down Expand Up @@ -156,10 +158,10 @@ export default class PdfView extends Component {
return this.state.contentContainerSize.height * this.state.pageAspectRate * this.state.scale;
case 2: //fit both
default: {
if ((this.state.contentContainerSize.width / this.state.contentContainerSize.height) > this.state.pageAspectRate) {
return this.state.contentContainerSize.height * this.state.scale * this.state.pageAspectRate;
} else {
if (this.state.contentContainerSize.width/this.state.contentContainerSize.height<this.state.pageAspectRate) {
return this.state.contentContainerSize.width * this.state.scale;
} else {
return this.state.contentContainerSize.height * this.state.pageAspectRate * this.state.scale;
}
}
}
Expand All @@ -182,11 +184,10 @@ export default class PdfView extends Component {
return this.state.contentContainerSize.height * this.state.scale;
case 2: //fit both
default: {
if ((this.state.contentContainerSize.width / this.state.contentContainerSize.height) > this.state.pageAspectRate) {
return this.state.contentContainerSize.height * this.state.scale;
} else {

if (this.state.contentContainerSize.width/this.state.contentContainerSize.height<this.state.pageAspectRate) {
return this.state.contentContainerSize.width * (1 / this.state.pageAspectRate) * this.state.scale;
} else {
return this.state.contentContainerSize.height * this.state.scale;
}
}
}
Expand Down
17 changes: 14 additions & 3 deletions ios/RCTPdf/PdfManager.m
Expand Up @@ -72,10 +72,21 @@ @implementation PdfManager

numberOfPages = (int)CGPDFDocumentGetNumberOfPages(pdfRef);
CGPDFPageRef pdfPage = CGPDFDocumentGetPage(pdfRef, 1);
CGRect pdfPageRect = CGPDFPageGetBoxRect(pdfPage, kCGPDFCropBox);
CGRect pdfPageRect = CGPDFPageGetBoxRect(pdfPage, kCGPDFMediaBox);
int rotation = CGPDFPageGetRotationAngle(pdfPage);

NSArray *params;

if (rotation == 90 || rotation==270) {
params =@[[NSNumber numberWithUnsignedLong:([pdfDocRefs count]-1)], [NSNumber numberWithInt:numberOfPages], [NSNumber numberWithFloat:pdfPageRect.size.height], [NSNumber numberWithFloat:pdfPageRect.size.width]];
RLog(@"Pdf loaded numberOfPages=%d, fileNo=%lu, pageWidth=%f, pageHeight=%f", numberOfPages, [pdfDocRefs count]-1, pdfPageRect.size.height, pdfPageRect.size.width);

} else {
params =@[[NSNumber numberWithUnsignedLong:([pdfDocRefs count]-1)], [NSNumber numberWithInt:numberOfPages], [NSNumber numberWithFloat:pdfPageRect.size.width], [NSNumber numberWithFloat:pdfPageRect.size.height]];
RLog(@"Pdf loaded numberOfPages=%d, fileNo=%lu, pageWidth=%f, pageHeight=%f", numberOfPages, [pdfDocRefs count]-1, pdfPageRect.size.width, pdfPageRect.size.height);

}

NSArray *params =@[[NSNumber numberWithUnsignedLong:([pdfDocRefs count]-1)], [NSNumber numberWithInt:numberOfPages], [NSNumber numberWithFloat:pdfPageRect.size.width], [NSNumber numberWithFloat:pdfPageRect.size.height]];
RLog(@"Pdf loaded numberOfPages=%d, fileNo=%lu, pageWidth=%f, pageHeight=%f", numberOfPages, [pdfDocRefs count]-1, pdfPageRect.size.width, pdfPageRect.size.height);
resolve(params);
return;
} else {
Expand Down
40 changes: 17 additions & 23 deletions ios/RCTPdf/RCTPdfPageView.m
Expand Up @@ -38,14 +38,16 @@

@implementation RCTPdfPageView {


CGRect _viewFrame;
}

- (instancetype)init
{
self = [super init];
if (self) {
self.backgroundColor = UIColor.whiteColor;
_viewFrame = CGRectMake(0, 0, 0, 0);

CATiledLayer *tiledLayer = (CATiledLayer *)[self layer];
tiledLayer.levelsOfDetailBias = 0;

Expand Down Expand Up @@ -79,8 +81,7 @@ - (void)didSetProps:(NSArray<NSString *> *)changedProps
- (void)reactSetFrame:(CGRect)frame
{
[super reactSetFrame:frame];
CATiledLayer *tiledLayer = (CATiledLayer *)[self layer];
tiledLayer.tileSize = frame.size;
_viewFrame = frame;
}

-(void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context
Expand All @@ -100,33 +101,26 @@ -(void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context

// Fill the background with white.
CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0);
CGContextFillRect(context, self.bounds);
CGContextFillRect(context, _viewFrame);

// PDF page drawing expects a Lower-Left coordinate system, so we flip the coordinate system before drawing.
CGContextScaleCTM(context, 1.0, -1.0);
CGContextTranslateCTM(context, 0, -_viewFrame.size.height);

CGRect pageBounds;

CGRect cropBox = CGPDFPageGetBoxRect(pdfPage, kCGPDFCropBox);

pageBounds = CGRectMake(0,
-self.bounds.size.height,
cropBox.size.width,
cropBox.size.height);

// first transform the same size as original pdf page
CGAffineTransform pageTransform = CGPDFPageGetDrawingTransform(pdfPage, kCGPDFCropBox, pageBounds, 0, true);
CGContextConcatCTM(context, pageTransform);
CGRect pdfPageRect = CGPDFPageGetBoxRect(pdfPage, kCGPDFMediaBox);

// then calculate the real scale and scale it
CGFloat scale = 1.0f;
if (self.bounds.size.width/self.bounds.size.height>cropBox.size.width/cropBox.size.height) {
scale = self.bounds.size.height/cropBox.size.height;
} else {
scale = self.bounds.size.width/cropBox.size.width;
int rotation = CGPDFPageGetRotationAngle(pdfPage);
if (rotation == 90 || rotation == 270) {
pdfPageRect = CGRectMake(0, 0, pdfPageRect.size.height, pdfPageRect.size.width);
}

CGContextScaleCTM(context, scale, scale);
CGContextScaleCTM(context, _viewFrame.size.width/pdfPageRect.size.width, _viewFrame.size.height/pdfPageRect.size.height);

if (rotation == 90 || rotation == 270) {
CGContextRotateCTM(context, -rotation*M_PI/180);
CGContextTranslateCTM(context, -pdfPageRect.size.height, 0);
}


// draw the content to context
CGContextDrawPDFPage(context, pdfPage);
Expand Down

0 comments on commit ace3f45

Please sign in to comment.