OP在這裏。
我發現了一種解決方案,它可以工作,而且不是非常難以實現。但我不確定這是最好的/理想的解決方案。我仍然有興趣尋找其他解決方案。但是,這裏有一個方法:
存儲爲源之前,手動縮放字體點大小和線高度多重顯示之前的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];
難道你可能需要10.8起來,利用10.8的內置文本縮放的?如果您可以要求10.8並且文本不必包裝到縮放區域,這可能是一種前進的方式。請參閱TextEdit的視圖>縮放...菜單項。 –