[英]How do I draw a grid of images in Cocoa and export it to a PDF?
我正在制作一个工具,该工具将从.csv
提取数据并在Cocoa中创建带有标题(如“ This ”)的图像网格,然后将其导出到PDF。 我不需要实际显示视图,只需保存一个文件。 作为以编程方式进行绘图的完整入门者,我对过程有一些疑问:
我应该使用什么课程? 我假设使用NSView
,但是就像我说的,我之前从未做过,所以不确定。
我需要为每个对象指定像素坐标,还是可以某种方式使每个对象相对于另一个对象?
如何为视图创建单独的页面?
请记住,我阅读了Apple指南,尽管它有一些有用的花絮,但总的来说,我很难理解。 如果有人可以用外行的术语解释我需要知道的内容,将不胜感激! 先感谢您。
总览
NSCollectionView类将内容数组显示为视图网格。 使用NSCollectionViewItem类指定视图,该类使加载包含视图的笔尖变得容易,并支持绑定
有很多教程。 包含:
可可编程L42-NSCollectionView和Apple自己的Collection Views快速指南
也许还看看NSDocuments
总览
NSDocument抽象类定义OS X文档的接口。 文档是可以内部表示窗口中显示的数据并且可以从文件或文件包读取数据或将数据写入文件或文件包的对象。 文档创建和管理一个或多个窗口控制器,然后由文档控制器管理。 文档响应第一响应者操作消息以保存,还原和打印其数据。
从概念上讲,文档是一个信息主体的容器,该信息主体由一个名称标识,并以该名称存储在磁盘文件中。 但是,从这个意义上说,文档与文件不同,而是属于内存中拥有和管理文档数据的对象。 在AppKit的上下文中,文档是自定义NSDocument子类的实例,该子类知道如何在内部以一种或多种格式表示在Windows中显示的持久性数据。
文档可以从文件读取该数据并将其写入文件。 它也是许多与文档相关的菜单命令(例如“保存”,“还原”和“打印”)的第一响应目标。 文档管理其窗口的编辑状态,并设置为执行撤消和重做操作。 窗口关闭时,在窗口委托之前要求文档批准关闭。
NSDocument是AppKit类的三元组之一,它们为基于文档的应用程序(其他的是NSDocumentController和NSWindowController)建立了架构基础。
几天前想通了,以为我会再回答其他有相同问题的人。
我应该使用什么课程? 我假设使用
NSView
,但是就像我说的,我之前从未做过,所以不确定。
实际上, NSView
是我用来绘制每个页面的类。
我需要为每个对象指定像素坐标,还是可以某种方式使每个对象相对于另一个对象?
最后,我确实为网格上的每个图像指定了像素坐标(加上其标题),但是一旦学会了8.50 x 11英寸页面的大小(单位为磅),就很容易计算应放置的位置。 下一个挑战是将它们绘制在for
循环中,而不是必须显式声明每个可能的NSRect
。 这是我在drawRect
的代码:
// Declared elsewhere: constants for horizontal/vertical spacing,
// the width/height for an image, and a value for what row the image
// should be drawn on
for (int i = 0; i < [_people count]; i++) {
float horizontalPoint = 0.0; // What column should the image be in?
if (i % 2 != 0) { // Is i odd? (i.e. Should the image be in the right column?)
horizontalPoint += (imageWidth + horizontalSpace); // Push it to the right
}
NSRect imageRect = NSMakeRect(horizontalSpace + horizontalPoint, verticalSpace + verticalPoint,
imageWidth, imageHeight);
// Draw the image with imageRect
if (i % 2 != 0) { // Is i odd? (i.e. Is the current row drawn?)
verticalPoint = (imageRect.origin.y + imageRect.size.height); // Push the row down
}
}
我确实意识到我可以更高效地进行编码(例如,为i % 2 != 0
制作BOOL
),但是我之所以赶紧整个项目是因为需要它的朋友在最后期限。
如何为视图创建单独的页面?
通过一些谷歌搜索,我想到了这个答案 。 但是,除非我对所有页面串联在一起有一个大的看法,否则这将行不通。 我想出了一种方法来做到这一点:
// Get an array of arrays containing 1-6 JANPerson objects each using data from a parsed in .csv
NSArray *paginatedPeople = [JANGridView paginatedPeople:people];
int pages = [JANGridView numberOfPages:people];
// Create a custom JANFlippedView (just an NSView subclass overriding isFlipped to YES)
// This will hold all of our pages, so the height should be the # of pages * the size of one page
JANFlippedView *view = [[JANFlippedView alloc] initWithFrame:NSMakeRect(0, 0, 612, 792 * pages)];
for (int i = 0; i < [paginatedPeople count]; i++) { // Iterate through each page
// Create a custom JANGridView with an array of people to draw on a grid
JANGridView *gridView = [[JANGridView alloc] initWithFrame:NSMakeRect(0, 0, 612, 792) people:paginatedPeople[i]];
// Push the view's frame down by 792 points for each page drawn already
// and add it to the main view
gridView.frame = NSMakeRect(0, 792 * i, gridView.frame.size.width, gridView.frame.size.height);
[view addSubview:gridView];
}
如果有人难以理解,我深表歉意。 与写作相比,我更擅长于讨论自己的过程! 如果有人有不清楚的地方,我欢迎任何人寻求帮助,或者编辑他们是否可以做得更好。
NsView; 那么是Mac应用程序吗?
CGPointMake返回具有指定坐标的点。 即使用矩阵将图像放置在屏幕上的特定位置,即
layer.position = CGPointMake ([self view].bounds.size.width /2, [self view].bounds.size.height /3 );
(此示例围绕核心动画(在屏幕上移动对象,因此请不要从字面上理解它),因此是layer属性)
也是这条线
layer.bounds= CGRectMake (100,100,1000,1000);
指定一个矩形边界(我相信可以使用桥使用图像和自定义数据填充矩形;像这样):
UIImage *image2 = [[UIImage alloc]initWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"flogo@2x"ofType:@"png"]];
layer.contents = (__bridge id)image2.CGImage;
我也相信cgdrawrect类与矩阵结合使用时,即(x,x,x,x)可以像在图像中一样绘制自定义矩形。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.