0
A
回答
0
我不得不做一些不属于公共API的类的子类。我了解了如何通过BWToolkit中的BWTokenField代码进行操作。它可以工作,但我本来想在没有公共API的情况下做到这一点,因为我可能希望有一天能够进入Mac App Store。我提交了一个要求公开API的错误报告,并且他们将该报告标记为重复。我不乐观,他们会做任何事情。
0
答案是类似这样的:How do I set the column margins in an NSTableView?
你需要继承NSTextFieldCell并覆盖-titleRectForBounds:通过矩形超级回报的宽度插页副本。
1
使用Objective-C运行时,似乎有一种方法可以在不划分私有类的情况下完成此操作。不过,这可能无法满足App Store的需求。
要使用Objective-C运行时,添加
#import <objc/runtime.h>
到你想的修改标记文件的顶部。在这个文件中(也许就NSTokenField
或NSTokenFieldCell
类别)类或类别的@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”;我正在使用“直接覆盖”方法调整。
相关问题
- 1. NSTokenField令牌消失非选择NSTokenField
- 2. jQuery - 减少滚动边距
- 3. NSTokenField选择的令牌
- 4. 从NSTokenField获取令牌
- 5. NSTokenField和删除令牌
- 6. 控制令牌减少
- 7. 减少matplotlib图中的左右边距
- 8. 减少Visual Studio 2015中的左边距
- 9. 从CustomDialog中减少标题的边距
- 10. 减少Bootstrap模板的页边距
- 11. ASP .NET MVC 5 - 减少左手边距
- 12. NSTokenField设置令牌的最大数量
- 13. 如何减少WP7中WrapPanel内的按钮边距?
- 14. 减少距离
- 15. NSTokenField不检查模糊令牌
- 16. Graphviz:减少倾斜的多边形节点上的边距
- 17. 减少间距GridView
- 18. 随着窗口尺寸减小,边距减少
- 19. 减少边界
- 20. 减少边境
- 21. 在不更改内容边距的情况下减少Box-Shadow保证金
- 22. 当按钮集中时减少按钮的边距
- 23. 我们怎样才能减少两条边之间的距离?
- 24. 如何减少Holo DatePicker&TimePicker的填充/边距?
- 25. 减少导航抽屉菜单项的左边距?
- 26. 减少表格视图的单元格填充或边距
- 27. 如何减少/删除分组UITableView中的左/右手边距?
- 28. 如何在achartengine中减少饼图的边距大小?
- 29. 乳胶:减少报价和诗句中的垂直边距
- 30. 如何通过Bootstrap减少面板的底部边距?
我正在谈论令牌本身(蓝色的)。不是文本字段。但似乎没有人可以使用这些令牌进行子类化... – Enchilada 2010-11-05 19:08:10
嗯......你说得对。我搜索了一下开源软件,但没有一个太明显。也许你可能会混淆属性字符串设置,并使用各种段落和间距设置。哈克,也许毫无意义,但也许...... :-) – 2010-11-05 19:24:29