问题描述
我正在尝试在HexFiend框架驱动的TextView中实现多色文本。我已经成功地将纯黑色设置为背景,但是现在我想要实现多色文本。我已经研究了很多HexFiend源代码,并想出了以下代码: 我将HFStringEncodingTextRepresenter子类化,并且确实覆盖了一种方法:styleForAttributes:ranges:
#import "HFRepresenterStringEncodingTextView.h"
#import <Cocoa/Cocoa.h>
#import <HexFiend/HexFiend.h>
#import "HFTextVisualStyleRun.h"
NS_ASSUME_NONNULL_BEGIN
@interface SpecialTextRepresenter : HFStringEncodingTextRepresenter
@end
NS_ASSUME_NONNULL_END
#import "SpecialTextRepresenter.h"
@implementation SpecialTextRepresenter
- (HFTextVisualStyleRun *)styleForAttributes:(NSSet *)attributes range:(NSRange)range {
HFTextVisualStyleRun *run = [[HFTextVisualStyleRun alloc] init];
[run setRange:NSMakeRange(0,[self.controller.byteArray length])];
[run setForegroundColor:[HFColor orangeColor]];
[run setBackgroundColor:[HFColor blackColor]];
NSMutableIndexSet *bookmarkExtents = nil;
if (! bookmarkExtents) bookmarkExtents = [[NSMutableIndexSet alloc] init];
[bookmarkExtents addIndexesInRange:NSMakeRange(0,[self.controller.byteArray length])];
if (bookmarkExtents) {
[run setBookmarkExtents:bookmarkExtents];
}
return run;
}
@end
我很高兴找到解决方案,但不幸的是,它看起来并不好:
到目前为止,我无法确定为什么行之间有那些彩色虚线。任何帮助是极大的赞赏。谢谢
解决方法
我发现了引起彩色线条的问题。它与HexFiend的一项功能(称为“书签”)有关。在这种情况下是不需要的,因为我们只对文本颜色感兴趣。因此,我的问题中列出的代码可以简化:
- (HFTextVisualStyleRun *)styleForAttributes:(NSSet *)attributes range:(NSRange)range {
HFTextVisualStyleRun *run = [[HFTextVisualStyleRun alloc] init];
[run setRange:NSMakeRange(0,[self.controller.byteArray length])];
[run setForegroundColor:[HFColor orangeColor]];
[run setBackgroundColor:[HFColor blackColor]];
return run;
}
结果看起来不错,就像我期望的那样:
设置一种颜色非常简单,可以覆盖上述方法,但是另一件事是实现基于范围的精确多色。我正在尝试通过使用HFRepresenterTextView的此属性来实现这一点:
@property (nullable,nonatomic,copy) NSArray *styles;
这是一个数组,其中包含HFTextVisualStyleRun类型的对象,与我们在上述重写方法中处理的对象相同。这很棘手,因为设置数组时,如果其中一个索引未分配属性,则框架会引发异常。一旦获得干净的解决方案,我将立即完成此答案。谢谢