2010-11-05 57 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」;我正在使用「直接覆蓋」方法調整。