OPはこちら。
ちょっと機能し、実装がそれほど難しくない解決策を1つ見つけました。ただし、これが最善/理想的な解決策であるかどうかはわかりません。私はまだ他の解決策を見つけることに興味があります。しかし、ここに1つの方法があります:
表示前にソース テキストのフォント ポイント サイズと行の高さの複数のプロパティを手動でスケーリングし、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];