我是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];
}