Các câu trả lời khác là chính xác rằng CGPDFPageGetDrawingTransform sẽ không mở rộng quy mô, tuy nhiên bạn có thể mở rộng hình chữ nhật xuống để chỉ chụp hộp đã chọn. Sử dụng CGPDFPageGetBoxRect() và tính toán tỷ lệ như Tommy đề xuất trong câu trả lời được chấp nhận, sau đó sử dụng để thu nhỏ hình chữ nhật chụp được chuyển vào 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);
}
Sau đó nó dễ dàng mở rộng để xử lý cảnh quan quá:
- (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);
}
bạn có thể vui lòng trả lời câu hỏi này tôi cũng đang cố gắng cùng một cách nhưng tôi không thể có được chính xác phù hợp http://stackoverflow.com/questions/3908624/cgcontext-pdf-page-aspect-fit – ajay
Đó là một liên kết đến câu hỏi này; có lẽ bạn có nghĩa là http://stackoverflow.com/questions/4321681/how-to-fit-pdf-page-in-entire-view? Tôi sẽ xem xét ngay sau khi tôi có cơ hội, mặc dù tôi thật đáng buồn trên đường ra ... – Tommy
Cập nhật nhỏ, CGPDFGetBoxRect có vẻ là CGPDFPageGetBoxRect nhưng cực kỳ hữu ích! Việc định cỡ này đã khiến tôi phát điên. Ngoài ra bạn có thể tìm thấy bao gồm cả dòng CGContextConcatCTM (ctx, CGPDFPageGetDrawingTransform (myPageRef, kCGPDFCropBox, layer.bounds, 0, true)); trước khi CGContextDrawPDFPage trợ giúp với bất kỳ tệp PDF nào được xoay 90 cạnh – sradforth