2010-11-05 61 views
0

我觉得NSTokenField中的令牌有太多的内边距,即我认为两边的半圆应该靠近文本。默认设置浪费太多空间。减少NSTokenField令牌的内边距

如何减少这些边距,并使令牌更紧凑?

回答

0

我不得不做一些不属于公共API的类的子类。我了解了如何通过BWToolkit中的BWTokenField代码进行操作。它可以工作,但我本来想在没有公共API的情况下做到这一点,因为我可能希望有一天能够进入Mac App Store。我提交了一个要求公开API的错误报告,并且他们将该报告标记为重复。我不乐观,他们会做任何事情。

0

答案是类似这样的:How do I set the column margins in an NSTableView?

你需要继承NSTextFieldCell并覆盖-titleRectForBounds:通过矩形超级回报的宽度插页副本。

+0

我正在谈论令牌本身(蓝色的)。不是文本字段。但似乎没有人可以使用这些令牌进行子类化... – Enchilada 2010-11-05 19:08:10

+0

嗯......你说得对。我搜索了一下开源软件,但没有一个太明显。也许你可能会混淆属性字符串设置,并使用各种段落和间距设置。哈克,也许毫无意义,但也许...... :-) – 2010-11-05 19:24:29

1

使用Objective-C运行时,似乎有一种方法可以在不划分私有类的情况下完成此操作。不过,这可能无法满足App Store的需求。

要使用Objective-C运行时,添加

#import <objc/runtime.h> 

到你想的修改标记文件的顶部。在这个文件中(也许就NSTokenFieldNSTokenFieldCell类别)类或类别的@implementation,加

static NSSize (*kOriginalCellSizeForBounds)(id, SEL, NSRect); 

NSSize cellSizeForBounds_override(id self, SEL _cmd, NSRect rect) 
{ 
    NSSize size = kOriginalCellSizeForBounds(self, _cmd, rect); 
    size.width -= 10; 
    return size; 
} 

static NSRect (*kOriginalTitleRectForBounds)(id, SEL, NSRect); 

NSRect titleRectForBounds_override(id self, SEL _cmd, NSRect rect) 
{ 
    NSRect titleRect = kOriginalTitleRectForBounds(self, _cmd, rect); 
    titleRect = NSInsetRect(rect, -5, 0); 
    return titleRect; 
} 

+ (void)load 
{ 
    Class tokenAttachmentCellClass = objc_getClass("NSTokenAttachmentCell"); 

    SEL selector = @selector(cellSizeForBounds:); 
    Method originalMethod = class_getInstanceMethod(tokenAttachmentCellClass, selector); 
    kOriginalCellSizeForBounds = (void *)method_getImplementation(originalMethod); 
    if(!class_addMethod(tokenAttachmentCellClass, selector, (IMP)cellSizeForBounds_override, method_getTypeEncoding(originalMethod))) { 
     method_setImplementation(originalMethod, (IMP)cellSizeForBounds_override); 
    } 

    selector = @selector(titleRectForBounds:); 
    originalMethod = class_getInstanceMethod(tokenAttachmentCellClass, selector); 
    kOriginalTitleRectForBounds = (void *)method_getImplementation(originalMethod); 
    if(!class_addMethod(tokenAttachmentCellClass, selector, (IMP)titleRectForBounds_override, method_getTypeEncoding(originalMethod))) { 
     method_setImplementation(originalMethod, (IMP)titleRectForBounds_override); 
    } 
} 

这里发生的事情是,我们正在减少令牌的原有宽度(cellSizeForBounds_override())和按比例增加单元格“标题”的宽度(在titleRectForBounds_override()中)。结果是水平边距减少的令牌在NSTokenField中仍可正常工作。你可以通过减少宽度来获得你想要的效果。

你可以在Mike Ash的文章“Method Replacement for Fun and Profit”;我正在使用“直接覆盖”方法调整。