我觉得NSTokenField中的标记有太多的内部边距,即我相信两个半圆(在每一侧)应该更靠近文本。默认设置浪费太多空间。

如何减少这些余量,并使代币更紧凑?

最佳答案

使用Objective-C运行时,似乎有一种无需子类化私有类即可完成此操作的方法。不过,这可能无法满足App Store的要求。

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

#import <objc/runtime.h>


到您要对令牌进行修改的文件顶部。在此文件中类别或类别的@implementation中(可能是NSTokenFieldNSTokenFieldCell上的类别),添加

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”中了解有关方法混乱的更多信息;我正在使用“直接覆盖”方法。

关于objective-c - 减少NSTokenField token 的内部边距,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4102976/

10-13 09:37