目标C语言 如何在PDF中使用Cocoa生成网格



我是Cocoa和Objective-C的初学者。

我想做一个Cocoa应用程序,它将生成一个网格框(用于练习中国书法)导出为PDF,类似于这个在线生成器:http://incompetech.com/graphpaper/chinesequarter/.

我应该如何生成网格?我曾尝试使用石英与CustomView,但没有设法得到很远。此外,一旦在CustomView中绘制了网格,将其"打印"到PDF的方法是什么?

谢谢你的帮助

我应该如何生成网格?

实现一个自定义视图来绘制它。

我已经尝试使用石英与CustomView,…

这是一种方法;AppKit绘图是另一个。不过,它们的大部分都非常相似;AppKit直接基于PostScript,而Quartz间接基于PostScript。

…,但没能走多远。

你应该问一个更具体的问题。

此外,一旦在CustomView中绘制了网格,将其"打印"到PDF的方法是什么?

给它发送一个dataWithPDFInsideRect:消息,通过它的边界。

注意,没有"一旦在CustomView中绘制网格"。虽然可能会有一些内部缓存,但从概念上讲,视图不会绘制一次并保留它;它会在需要的时候,每次需要的时候,把它拉到需要的地方。当窗口需要重新绘制时,Cocoa将告诉脏区域中的任何视图(重新)绘制,它们最终将绘制到屏幕上。当你请求PDF数据时,它也会告诉视图去绘制,它会绘制到一个记录PDF数据的上下文中。这使得视图既可以是惰性的(只在需要时绘制),也可以在不同的上下文中以不同的方式绘制(例如,在打印时)。

哎呀,你问的是Cocoa,这是Cocoa Touch,但我将把它留在这里,因为它可能会有一些用途(至少对稍后发现它的其他人)。

你可以在视图中画一些东西,然后把那里的东西放到pdf中。

这段代码将获取在UIView(这里称为sheetView)中绘制的内容,将其放入pdf中,然后将其作为电子邮件中的附件(因此您现在可以看到它)。你需要在头文件中引用MFMailComposeViewControllerDelegate协议。

if ([MFMailComposeViewController canSendMail]) {
    //set up PDF rendering context
    NSMutableData *pdfData = [NSMutableData data];
    UIGraphicsBeginPDFContextToData(pdfData, sheetView.bounds, nil);
    UIGraphicsBeginPDFPage();
    //tell our view to draw (would normally use setNeedsDisplay, but need drawn now).
    [sheetView drawRect:sheetView.bounds];
    //remove PDF rendering context
    UIGraphicsEndPDFContext();
    //send PDF data in mail message as an attachment
    MFMailComposeViewController *mailComposer = [[[MFMailComposeViewController alloc] init] autorelease];
    mailComposer.mailComposeDelegate = self;If
    [mailComposer addAttachmentData:pdfData mimeType:@"application/pdf" fileName:@"SheetView.pdf"];
    [self presentModalViewController:mailComposer animated:YES];
}
else {
    if (WARNINGS) NSLog(@"Device is unable to send email in its current state.");
}

你还需要这个方法…

#pragma mark -
#pragma mark MFMailComposeViewControllerDelegate protocol method
//also need to implement the following method, so that the email composer can let
//us know that the user has clicked either Send or Cancel in the window.
//It's our duty to end the modal session here.
-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
    [self dismissModalViewControllerAnimated:YES];
}

最新更新