我觉得NSTokenField中的标记有太多的内部边距,即我相信两个半圆(在每一侧)应该更靠近文本。默认设置浪费太多空间。
如何减少这些余量,并使代币更紧凑?
最佳答案
使用Objective-C运行时,似乎有一种无需子类化私有类即可完成此操作的方法。不过,这可能无法满足App Store的要求。
要使用Objective-C运行时,请添加
#import <objc/runtime.h>
到您要对令牌进行修改的文件顶部。在此文件中类别或类别的
@implementation
中(可能是NSTokenField
或NSTokenFieldCell
上的类别),添加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/