Objective c 更改搜索字段的高度

Objective c 更改搜索字段的高度,objective-c,cocoa,Objective C,Cocoa,我目前有一个标准的NSSearchField(在nib中)。苹果公司将高度固定在22像素。应用程序支持或使用藏文Unicode。藏文字符是从左到右书写的,但某些相邻字符垂直堆叠,这使得行距异常大。输入到搜索字段中的文本将被剪裁。我的解决方案是子类化NSSearchFieldCell,如果必要的话NSSearchField 第一个问题:很难确定要覆盖哪些方法。我在苹果的文档中找到了一些提示,但没有系统性的内容。任何指点都很感激 到目前为止我所拥有的:我将NSSearchFieldCell子类化。我

我目前有一个标准的
NSSearchField
(在nib中)。苹果公司将高度固定在22像素。应用程序支持或使用藏文Unicode。藏文字符是从左到右书写的,但某些相邻字符垂直堆叠,这使得行距异常大。输入到搜索字段中的文本将被剪裁。我的解决方案是子类化
NSSearchFieldCell
,如果必要的话
NSSearchField

第一个问题:很难确定要覆盖哪些方法。我在苹果的文档中找到了一些提示,但没有系统性的内容。任何指点都很感激

到目前为止我所拥有的:我将
NSSearchFieldCell
子类化。我替换了
searchTextRectForBounds
cancelButtonRectForBounds
searchButtonRectForBounds
,最后是
drawWithFrame inView

我得到了一个理想尺寸的像样的图形图像。取消按钮在预期位置绘制,但我不知道取消按钮控件在屏幕上的什么位置

我还需要覆盖哪些其他方法

为了说明这个问题,下面的文本ཀླུའི་རྒྱལ་པོ་

在Finder使用的搜索栏中,音译为拉丁/罗马字母klu'i rgyal po。请注意,gigu“U”沿底部剪裁


您需要创建一个自定义NSSearchFieldCell子类,并覆盖drawWithFrame:,然后将NSSearchField设置为使用该单元格。可以在代码中绘制自定义边框,也可以在水平平铺的中心使用端盖图像和背景图像。 (我没有试过这个)

试试看


或者,只需创建一个NSTextFeild,然后更新视图。

我根本不会走这条路。相反,您应该将NSView子类化,并在其中粘贴一个NSTextField+NSPopUpButton+NSButton


通过一系列的黑客攻击,你可以让它工作,但随后OS X 10.10将发布,它将被破坏。

我最终做了什么:
(最终用户似乎对这个解决方案很满意,至少现在是这样。)在NSPover中输入NSSearchField文本时,我会回显它。我从一个单独的笔尖创建了一个暂时的popover,并将其保留。然后在绑定到搜索栏的iAction中,我添加了以下代码:

- (IBAction)SearchPartial:(id)sender {
NSInteger recordNumber;
DefinitionEntity *def;
searchText = [self.SearchField stringValue];

if (!popupShows) {
    popupShows = YES;
    NSRectEdge prefEdge = NSMinXEdge;
    [searchBarPopover showRelativeToRect:[sender bounds] ofView:sender preferredEdge:prefEdge];
    [self.SearchField becomeFirstResponder];
    //[[self.SearchField cell] setPlaceholderString:searchText];
    [self.SearchField setStringValue:searchText];
    [[self.SearchField currentEditor] setSelectedRange: NSMakeRange(0, 0)];
    [[self.SearchField currentEditor] moveToEndOfLine:nil];
}
popoverViewController.textField.stringValue = searchText;
recordNumber = [self upDateSearch:searchText];
def = [self.lookupModel getEntrybyNumber:recordNumber];
[self.parent lookupSelectionDidChange:def];
}


popover的一个问题是,当它出现时,它会成为第一反应者。我引用了这个问题的答案:。在编辑/还原文本之前,将firstresponder重新分配到搜索字段是很重要的。

应该是现成的-如果在Finder中的搜索字段中输入一些垂直堆叠的字符,会发生什么情况?@cacau它还会剪辑文本。有许多语言至少把元音写在文本的上方和下方。一些语言更进一步,垂直组合某些相邻字符。我相信我完全遵循了您的第一个建议(在代码中绘制自定义边框)。搜索字段将正确显示并接受较大的文本。“取消”按钮从父NSSearchField中正确绘制,但“取消”按钮控件位于其他位置,甚至不处于活动状态。我不确定,这取决于您的实现,如果您正在子类化,则始终可以将项添加到视图中。试着手动链接,我不太明白到底发生了什么,尽管看起来我正在尝试做的事情确实是脆弱的,即使我现在让它正常工作。通过子类化NSView,我还获得了不使用自动布局的好处。谢谢