首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否在运行时使用NSFontPanel更改NSTableView的字体、字体颜色和背景颜色?

是否在运行时使用NSFontPanel更改NSTableView的字体、字体颜色和背景颜色?
EN

Stack Overflow用户
提问于 2014-07-01 02:39:32
回答 2查看 2.8K关注 0票数 4

我想让用户更改基于视图的NSTableView的字体。我使用的是Cocoa绑定和核心数据。在我的测试代码中,我确实有一个changeFont:方法,只要我按下与字体相关的组合键(如cmd-Icmd-B ),就会立即调用该方法,但到目前为止,我还没有机会更改表视图的实际字体:

代码语言:javascript
复制
- (void)changeFont:(id)sender
{
    NSFont *oldFont = [self.airportTableView font];
    NSFont *newFont = [sender convertFont:oldFont];
    NSLog(@"sender: %@ oldfont: %@, newFont: %@ fontmanager selected: %@, font panel selected: %@",
             sender, oldFont, newFont, [sender selectedFont], [sender convertFont:[sender selectedFont]]);
    [self.airportTableView setFont:newFont];
}

生成以下输出:

代码语言:javascript
复制
sender: <NSFontManager: 0x6080000b4580> oldfont: (null), newFont: (null) fontmanager selected: (null), font panel selected: (null)

即使是这段微不足道的代码:

代码语言:javascript
复制
font = [NSFont boldSystemFontOfSize:12];
[self.airportTableView setFont:font];
NSFont *oldFont = [self.airportTableView font];
NSLog(@"oldfont: %@",oldFont);

只会产生以下结果:

代码语言:javascript
复制
oldfont: (null)

任何人都可以提供一些代码,允许用户更改NSTableView的字体吗?

EN

回答 2

Stack Overflow用户

发布于 2014-07-01 02:57:03

您必须设置单元格的字体。而不是桌面视图。使用以下委托方法:

代码语言:javascript
复制
- (NSCell *)tableView:(NSTableView *)tableView dataCellForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    NSTextFieldCell *cell = [tableColumn dataCell];
    [cell setFont:[NSFont systemFontOfSize:11]];
    [cell setTextColor: [NSColor lightGrayColor]];

    return cell;
}
票数 2
EN

Stack Overflow用户

发布于 2014-07-02 18:57:37

使用internets的强大功能,我能够将以下代码片段组合在一起,这些代码片段响应更改NSTableView的字体类型、字体颜色和背景颜色的NSFontPanel操作

代码语言:javascript
复制
@interface AppDelegate
{
    NSFont                  *_font;
    NSColor                 *_fontColor;
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    [[NSFontManager sharedFontManager] setTarget:self];
    _font      = [NSFont systemFontOfSize:0];
    _fontColor = [NSColor blackColor];
}


- (void)changeFont:(id)sender
{
    _font = [sender convertFont:_font];
    [self.airportTableView reloadData];
}

- (void)setColor:(NSColor *)col forAttribute:(NSString *)attr {
    if ([attr isEqualToString:@"NSDocumentBackgroundColor"]) {
        self.airportTableView.backgroundColor = col;
    } else if ([attr isEqualToString:@"NSColor"]) {
        _fontColor  = col;
        [self.airportTableView reloadData];
    }
}


- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {

    NSTableCellView *cellView   = [tableView makeViewWithIdentifier:[tableColumn identifier] owner:self];
    NSTextField *textField      = [cellView textField];
    textField.font          = _font;
    textField.textColor     = _fontColor;
    return cellView;
}

- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row
{
    return _font.boundingRectForFont.size.height + 2.0f;
}

注意对reloadData的显式调用,否则表视图的可见部分不会更新。如果有更好的解决方案,请告诉我。

还要注意,-setColor:forAttribute:是没有文档记录的。显然,如果您的类响应它,-changeAttributes:将不会被调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24496760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档