我目前有一个标准NSSearchField
(在笔尖中)。 Apple的高度为22px。该应用程序支持或使用西藏Unicode。藏文字符从左到右书写,但某些相邻字符垂直堆叠,这使得行高异常大。输入搜索字段的文本将被剪裁。我的解决方案是子类NSSearchFieldCell
,如果必要的话NSSearchField
。
第一个问题:很难找出要覆盖的方法。我在Apple文档中找到了提示,但没有任何系统性。任何指针都表示赞赏。
到目前为止:我已经将NSSearchFieldCell
分包了。我替换了searchTextRectForBounds
,cancelButtonRectForBounds
,searchButtonRectForBounds
,最后是drawWithFrame inView
。
我得到了所需尺寸的图像。取消按钮在预期位置绘制,但我不知道取消按钮控件在屏幕上的位置。
我需要覆盖哪些其他方法?
为了说明问题,请参阅以下文字ཀླུའི་རྒྱལ་པོ་
在Finder使用的搜索栏中音译成拉丁文/罗马字母klu'i rgyal po。请注意,gigu“U”沿底部被剪裁。
答案 0 :(得分:3)
我根本不会走那条路。相反,你应该继承NSView并在其中粘贴NSTextField + NSPopUpButton + NSButton。
随着一堆黑客攻击,你会让它工作,但OS X 10.10将会发货,它将被破坏。
答案 1 :(得分:2)
您需要创建自定义NSSearchFieldCell子类,并覆盖drawWithFrame:,然后将NSSearchField设置为使用该单元格。您可以在代码中绘制自定义边框,也可以使用端盖图像和水平平铺中心的背景图像。 (我没试过这个)
尝试一下。
或者,只需创建一个NSTextFeild,然后更新视图。
答案 2 :(得分:0)
我最终做了什么:
(最终用户似乎对此解决方案感到满意,至少目前是这样。)我回复了NSSearchField文本,因为它已输入NSPopover中的文本字段。我从一个单独的笔尖创建了一个瞬态弹出框并保持它。然后在绑定到搜索栏的IBAction中添加了以下代码:
- (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的一个问题是它们在显示时成为第一反应者。我引用了这个问题的答案:show-nspopover-without-Focus。在编辑/恢复文本之前,重新将firstresponder分配给搜索字段非常重要。