在这里。
我找到了一种可行的解决方案,而且实施起来并不难。但是,我不确定这是最佳/理想的解决方案。我仍然有兴趣寻找其他解决方案。但这是一种方法:
在显示之前手动缩放源文本的字体点大小和行高多个属性NSAttributedString
,然后在存储为源之前取消缩放显示的文本。
此解决方案的问题在于,在缩放时,系统字体面板将在编辑时显示所选文本的实际缩放显示点大小(而不是“真实”源点大小)。这是不可取的。
这是我的实现:
- (void)scaleAttributedString:(NSMutableAttributedString *)str by:(CGFloat)scale {
if (1.0 == scale) return;
NSRange r = NSMakeRange(0, [str length]);
[str enumerateAttribute:NSFontAttributeName inRange:r options:0 usingBlock:^(NSFont *oldFont, NSRange range, BOOL *stop) {
NSFont *newFont = [NSFont fontWithName:[oldFont familyName] size:[oldFont pointSize] * scale];
NSParagraphStyle *oldParaStyle = [str attribute:NSParagraphStyleAttributeName atIndex:range.location effectiveRange:NULL];
NSMutableParagraphStyle *newParaStyle = [[oldParaStyle mutableCopy] autorelease];
CGFloat oldLineHeight = [oldParaStyle lineHeightMultiple];
CGFloat newLineHeight = scale * oldLineHeight;
[newParaStyle setLineHeightMultiple:newLineHeight];
id newAttrs = @{
NSParagraphStyleAttributeName: newParaStyle,
NSFontAttributeName: newFont,
};
[str addAttributes:newAttrs range:range];
}];
}
这需要在显示之前缩放源文本:
// scale text
CGFloat scale = getCurrentScaleFactor();
[self scaleAttributedString:str by:scale];
然后在存储为源之前反向缩放显示的文本:
// un-scale text
CGFloat scale = 1.0 / getCurrentScaleFactor();
[self scaleAttributedString:str by:scale];