現在のビューを取得してページに分割し、PDFドキュメントをレンダリングするUIView+PDFViewというUIView拡張クラスがあります。私の問題はレンダリング部分にあります。コンテンツのページを正常に「作成」できますが、最初のページ以降のすべてのページが空白になります。私の最終目標は、現在のビューを取得し、ページに等しい幅を「拡大縮小」し、PDF内の残りのビューをページ分割することです。
問題ではないもの:
- PDFを電子メールに添付する
- PDFをプリンター/印刷シミュレーターに送信する
- 実際にPDFを正しく生成しながら1ページだけを印刷する
- ビューのサイズを正しく変更する(SO質問4919388)
- メソッドに送信する前にこれを行います。フレームの高さを10ピクセルにして確認しましたが、1ページ(および1ページのみ)を印刷します
- ビューを正しく翻訳します。翻訳とスケールの両方を行うことによって検証されました。どちらもビューを正しく変更しましたが、どちらも最初のページ以上にレンダリングされませんでした。
私のコードは次のとおりです。
@interface UIView (PDFView)
-(id)createPDFAndSaveToDocumentsWithFileName:(NSString*)aFilename andDocumentInfo:(NSDictionary *)documentInfo;
@end
@implementation UIView (PDFView)
-(id)createPDFAndSaveToDocumentsWithFileName:(NSString*)aFilename andDocumentInfo:(NSDictionary *)documentInfo {
// http://developer.apple.com/library/ios/DOCUMENTATION/GraphicsImaging/Reference/CGPDFContext/Reference/reference.html#//apple_ref/doc/constant_group/Auxiliary_Dictionary_Keys
// Creates a mutable data object for updating with binary data, like a byte array
NSMutableData *pdfData = [NSMutableData data];
// Points the pdf converter to the mutable data object and to the UIView to be converted
CGSize pageSize = CGSizeMake(self.bounds.size.width, 792);
UIGraphicsBeginPDFContextToData(pdfData, CGRectZero, documentInfo);
CGContextRef pdfContext = UIGraphicsGetCurrentContext();
NSInteger currentPage = 0;
BOOL done = NO;
do {
CGRect currentPageRect = CGRectMake(0, (pageSize.height*currentPage), pageSize.width, pageSize.height);
UIGraphicsBeginPDFPageWithInfo(currentPageRect, nil);
// draws rect to the view and thus this is captured by UIGraphicsBeginPDFContextToData
[self.layer renderInContext:pdfContext];
// If we're at the end of the view, exit the loop.
if ((pageSize.height*currentPage) > self.bounds.size.height) {
done = YES;
} else {
currentPage++;
}
} while (!done);
// remove PDF rendering context
UIGraphicsEndPDFContext();
if (aFilename == nil) {
return pdfData;
} else {
// Retrieves the document directories from the iOS device
NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
NSString* documentDirectory = [documentDirectories objectAtIndex:0];
NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:aFilename];
// instructs the mutable data object to write its context to a file on disk
[pdfData writeToFile:documentDirectoryFilename atomically:YES];
NSLog(@"documentDirectoryFileName: %@",documentDirectoryFilename);
return nil;
}
}