Die anderen Antworten sind korrekt, dass CGPDFPageGetDrawingTransform nicht hochskaliert wird. Sie können jedoch das Rechteck nach unten skalieren, um nur die ausgewählte Box zu erfassen. Verwenden Sie CGPDFPageGetBoxRect() und berechnen Sie die Skalierung wie von Tommy in der akzeptierten Antwort vorgeschlagen, und verwenden Sie diese, um das in CGPDFPageGetDrawingTransform() übergebene Erfassungsrechteck zu verkleinern.
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0);
CGContextFillRect(ctx, layer.bounds);
CGContextTranslateCTM(ctx, 0.0, layer.bounds.size.height);
CGRect box = CGPDFGetBoxRect(myPageRef, kCGPDFBleedBox);
CGFloat xScale = layer.bounds.size.width/cropBox.size.width;
CGFloat yScale = layer.bounds.size.height/cropBox.size.height;
CGFloat scaleToApply = xScale < yScale ? xScale : yScale;
CGRect captureRect = CGRectMake(0, 0,
layer.bounds.size.width/scaleToApply,
layer.bounds.size.height/scaleToApply);
CGAffineTransform drawXfm = CGPDFPageGetDrawingTransform(myPageRef,
kCGPDFBleedBox,
captureRect,
0,
true);
CGContextScaleCTM(ctx, scaleToApply, -scaleToApply);
CGContextConcatCTM(ctx, drawXfm);
CGContextDrawPDFPage(ctx, myPageRef);
}
Dann ist es leicht zu handhaben Landschaft erweitert:
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0);
CGContextFillRect(ctx, layer.bounds);
CGContextTranslateCTM(ctx, 0.0, layer.bounds.size.height);
CGRect box = CGPDFGetBoxRect(myPageRef, kCGPDFBleedBox);
int rotate;
CGFloat xScale, yScale;
if (box.size.width > box.size.height) {
// landscape
rotate = 270;
xScale = layer.bounds.size.height/cropBox.size.width;
yScale = layer.bounds.size.width/cropBox.size.height;
} else {
// portrait
rotate = 0;
xScale = layer.bounds.size.width/cropBox.size.width;
yScale = layer.bounds.size.height/cropBox.size.height;
}
CGFloat scaleToApply = xScale < yScale ? xScale : yScale;
CGRect captureRect = CGRectMake(0, 0,
layer.bounds.size.width/scaleToApply,
layer.bounds.size.height/scaleToApply);
CGAffineTransform drawXfm = CGPDFPageGetDrawingTransform(myPageRef,
kCGPDFBleedBox,
captureRect,
rotate,
true);
CGContextScaleCTM(ctx, scaleToApply, -scaleToApply);
CGContextConcatCTM(ctx, drawXfm);
CGContextDrawPDFPage(ctx, myPageRef);
}
können Sie bitte diese Frage beantworten, ich versuche auch auf die gleiche Weise, aber ich kann nicht die genaue Passform erhalten http://StackOverflow.com/Questions/3908624/CGCONTEXT-PDF-PAGE-aspect-fit – ajay
Das ist ein Link zu dieser Frage; wahrscheinlich meintest du http://stackoverflow.com/questions/4321681/how-to-fit-pdf-page-in-entire-view? Ich werde es mir ansehen, sobald ich eine Chance bekomme, obwohl ich jetzt leider auf dem Weg nach draußen bin ... – Tommy
Minor Update, CGPDFGetBoxRect scheint jetzt CGPDFPageGetBoxRect zu sein, aber unglaublich hilfreich! Diese Dimensionierung hat mich verrückt gemacht. Sie können auch die Zeile CGContextConcatCTM finden (ctx, CGPDFPageGetDrawingTransform (myPageRef, kCGPDFCropBox, layer.bounds, 0, true)); vor der CGContextDrawPDFPage hilft mit PDF-Dateien, die 90 Degees gedreht werden – sradforth