如何使用文本输入选项创建自定义NSTextField

时间:2016-01-18 11:08:31

标签: objective-c macos cocoa custom-controls nstextfield

我正在试图弄清楚如何像屏幕截图上那样自定义NSTextField。任何人都可以指向我至少指导或正确的方向吗?我的意思是我明白你可以画出背景和方框,但你如何告诉方框它接受文字和它应该是什么尺寸等?

非常感谢任何帮助。

see section Built-in Functions for String Manipulation

2 个答案:

答案 0 :(得分:0)

老实说,我只看到两种方法:子类化NSTextField并根据您的需要进行调整,但是您将面临很多限制,或者创建一个看起来像NSTextfield的类。

在第二个选项中,您可以绘制背景,边框,标签,图标和光标。此外,您可以为光标设置动画,根据文本字段的状态更改颜色和字体。这是很多工作要做,可能已经有一个很酷的图书馆正在寻找你想要的东西。

在这两种情况下,您都需要管理键盘以使用您想要的键盘(我的意思是用于填写电子邮件地址的电子邮件键盘)。

答案 1 :(得分:0)

由于实际文本似乎与边框重叠,因此一种方法是使用自定义视图类绘制边框并在其中放置NSTextView以执行文本输入。只需将NSTextView设置为无边框,并将背景颜色与视图匹配即可。

如果只是需要偶尔输入并且您想要一个轻量级控件,您甚至可以考虑为文本使用标签,或者只是让NSString对象使用-drawInRext:withAttribures:绘制自己并抓取共享的NSTextField并放置它在顶部进行编辑。这就是NSTableView实例编辑的方法。

我已经实现了类似的选项卡控件,我支持通过双击编辑标题(如excel选项卡)。以下是一些如何将共享文本编辑器作为灵感的代码。然后,您需要通过委托方法管理编辑过程。

-(BOOL)beginEditLabelInteractiveForTab:(NSInteger)index {

    if (![self.window makeFirstResponder:self.window]) {  // Try to make window first responder to ensure the shared field editor is available.
        return NO;
    };

    NSTextView *tv = (NSTextView *)[self.window fieldEditor:YES forObject:nil]; // take the shared field editor and configure it
    if (!tv) {  // Did not get the field editor
        return NO;
    }

    // Set font and location
    [tv setVerticallyResizable:NO];
    [tv setFont:self.textFont];
    [tv setBackgroundColor:self.selectedFieldColor];
    [tv setTextColor:self.editingColor];
    [tv setEditable:YES];

    editedTab = [self.tabs objectAtIndex:index];
    tv.string = editedTab.label;         // Set text

    CGFloat w = editedTab.coreWidth + BSTeditorExtraPadding; // Slightly larger to fit the cursor
    CGFloat h = (self.tabHeight < (self.preferredTextHeight-(2 * BSTstdYTextOffset))) ? (self.tabHeight-(2 * BSTstdYTextOffset)) : self.preferredTextHeight; // Text height or tab ht - 4 whichever is less
    [tv setFrameSize:NSMakeSize(w,h)];
    // x poistion is set in owner draw method to match location of tab

    tv.textContainer.lineFragmentPadding = 0; // remove padding for alignment with text below

    tv.delegate = self;
    [self addSubview:tv];
    [self.window makeFirstResponder:tv];

    self.labelEditor = tv;  // Store a reference also used as a flag
    return YES;

}