gpt4 book ai didi

objective-c - 减少 NSTokenField 标记的内部边距

转载 作者:行者123 更新时间:2023-12-03 18:03:37 25 4
gpt4 key购买 nike

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

如何减少这些边距,并使 token 更加紧凑?

最佳答案

使用 Objective-C 运行时,似乎有一种方法可以完成此任务,而无需子类化私有(private)类。不过,这可能无法绕过 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);
}
}

这里发生的是,我们减少了 token 的原始宽度(在 cellSizeForBounds_override() 中),并按比例增加了单元格“标题”的宽度(在 titleRectForBounds_override() 中) )。结果是水平边距减少的 token 在 NSTokenField 中仍然可以正常工作。您可以调整宽度的减少量以获得您想要的效果。

您可以在 Mike Ash 的文章 “Method Replacement for Fun and Profit” 中阅读有关方法混合的更多信息。 ;我正在使用“直接覆盖”方法调配。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com