我正在尝试获取NSTextFieldCell的NSPoint cooridnates,但NSTextFieldCell不从NSView继承,因此没有frame方法。关于如何解决这个问题的任何想法?
我正在尝试使用Matt Gemmel的MAAttachedWindow将小助手弹出窗口附加到某些元素上。我想将它附加到窗口上的某个区域,除了通过手动弄乱x和y坐标将它们混合在一起之外,我不知道如何获得坐标。
答案 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非常不同。)