Les autres réponses sont correctes: CGPDFPageGetDrawingTransform n'augmentera pas, mais vous pouvez redimensionner le rectangle pour capturer uniquement la zone choisie. Utilisez CGPDFPageGetBoxRect() et calculez l'échelle comme suggéré par Tommy dans la réponse acceptée, puis utilisez-la pour réduire le rectangle de capture transmis dans CGPDFPageGetDrawingTransform().
- (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);
}
Ensuite, il est facilement étendu pour gérer le paysage aussi:
- (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);
}
pouvez-vous s'il vous plaît répondre à cette question, je suis aussi essayer de la même manière, mais je ne peux pas obtenir la forme exacte http://stackoverflow.com/questions/3908624/cgcontext-pdf-page-aspect-fit – ajay
C'est un lien vers cette question; probablement vous vouliez dire http://stackoverflow.com/questions/4321681/how-to-fit-pdf-page-in-entire-view? Je vais jeter un coup d'oeil dès que j'en aurai l'opportunité, même si je suis malheureusement sur le point de sortir maintenant ... – Tommy
Mise à jour mineure, CGPDFGetBoxRect semble être maintenant CGPDFPageGetBoxRect mais incroyablement utile! Cette taille m'a rendu fou. Vous pouvez également trouver la ligne CGContextConcatCTM (ctx, CGPDFPageGetDrawingTransform (myPageRef, kCGPDFCropBox, layer.bounds, 0, true)); avant que le fichier CGContextDrawPDFPage ne soit pris en charge avec les fichiers PDF faisant l'objet de 90 conversions – sradforth