NSTextFieldCell坐标

时间:2009-05-27 21:05:48

标签: objective-c cocoa

我正在尝试获取NSTextFieldCell的NSPoint cooridnates,但NSTextFieldCell不从NSView继承,因此没有frame方法。关于如何解决这个问题的任何想法?

我正在尝试使用Matt Gemmel的MAAttachedWindow将小助手弹出窗口附加到某些元素上。我想将它附加到窗口上的某个区域,除了通过手动弄乱x和y坐标将它们混合在一起之外,我不知道如何获得坐标。

4 个答案:

答案 0 :(得分:3)

您可以调用[theCell controlView]来获取对拥有特定单元格的控件的引用。如果NSTextFieldCell对象是简单控件的一部分,例如NSTextField,则以下内容就足够了:

NSRect cellFrame = [[theCell controlView] frame];
NSPoint origin = cellFrame.origin;
//..

但是,如果NSTextFieldCell是更复杂控件的一部分,例如NSTableView,其中单个单元格在多个位置使用,则需要更多信息才能确定适当的矩形。 NSCell提供了方法representedObject,可以帮助您确定 NSTableView中的哪个对象在该特定时刻由单元格表示。在不了解您的具体案例的情况下,我不知道在这方面提供了多少细节。

这是一种可能的解决方案,假设您能够从representedObject中存储的对象中识别行和列信息:

NSTableView * tableView = [theCell controlView];
id cellObject = [theCell representedObject];

NSInteger row = //... determine from representedObject
NSInteger col = //... determine from representedObject

NSRect cellFrame = [tableView frameOfCellAtColumn:col row:row];

答案 1 :(得分:2)

单元格是一个可重用的对象,由NSControl(NSView子类)拥有。它没有原点,因为它实际上并不代表屏幕上的一个位置,它取决于控件(具有特定的框架矩形)以在需要的地方和时间绘制它。例如,考虑一个表格视图,它可能会使用在每个行的几个地方重新绘制的单个单元格。

当控件被绘制到屏幕上时,控件传递一个框架矩形,在大多数情况下应该是你需要的全部。您还可以利用NSCell的大小调整方法,它可以告诉您显示其内容所需的空间。

答案 2 :(得分:2)

对于使用MAAttachedWindow,您是否可以使用控件的框架(如果它是单单元格控件),或者在具有特定行的表视图的情况下使用NSTableView布局方法之一?例如,rectOfRow:rectOfColumn:。您可以覆盖NSTextFieldCell并将窗口放在其中一个绘图方法中,但如果可能的话,我会将其保存为绝对的最后选择。

答案 3 :(得分:1)

它没有坐标。没有人可以得到。单元格工作的方式是视图告诉单元格“draw here”。

所以,如果你不是单元格的绘图方法之一,而且你真的需要坐标,你需要询问拥有单元格的视图。通常,这是[cell controlView]

(也许您正在考虑UIKit?UITableViewCells与NSCells非常不同。)