当您在drawInteriorWithFrame:inView:中调用[super-drawInterioWithFrame:cellFrame时,有没有方法可以获得NSTextFieldCell中文本的绘制位置?
文本矩形是titleRectForBounds:
通过cellFrame
的返回值,带有神秘的2px水平插入:
// this code ...
NSRect bounds = NSInsetRect(cellFrame, 2, 0); // dont ask me why
NSRect titleRect = [self titleRectForBounds:bounds];
[self.attributedStringValue drawInRect:titleRect];
// ... is equivalent to
[super drawInteriorWithFrame:cellFrame inView:controlView];
我不确定这些2px代表什么,它是通过尝试10.6到10.9-预览版的所有操作系统以及所有可能的文本字段配置来实验得出的。似乎总是有这个无条件的2px插图。通过设置断点和查看调试器反汇编,可以很容易地确认默认实现确实使用这些参数调用了NSInsetRect
。
我的猜测是:为了更好的排版(放大并仔细观察W或A字母与H或p相比的真实),需要2px插图来避免在开始或停止字母超出边界时进行剪切。