我需要设置使用多种字体的所选富文本的文本大小(例如,42)。
我想我可以检查每组字符的属性,修改字体大小和设置属性,但是看看浮动字体面板,似乎应该有一种非常简单直接的方法来实现它。我会错过一些明显的东西吗?
答案 0 :(得分:11)
在10.6上,有一种方便的方法来迭代属性并增加字体大小。 此方法可以添加到NSTextView类别。
- (IBAction)increaseFontSize:(id)sender
{
NSTextStorage *textStorage = [self textStorage];
[textStorage beginEditing];
[textStorage enumerateAttributesInRange: NSMakeRange(0, [textStorage length])
options: 0
usingBlock: ^(NSDictionary *attributesDictionary,
NSRange range,
BOOL *stop)
{
#pragma unused(stop)
NSFont *font = [attributesDictionary objectForKey:NSFontAttributeName];
if (font) {
[textStorage removeAttribute:NSFontAttributeName range:range];
font = [[NSFontManager sharedFontManager] convertFont:font toSize:[font pointSize] + 1];
[textStorage addAttribute:NSFontAttributeName value:font range:range];
}
}];
[textStorage endEditing];
[self didChangeText];
}
答案 1 :(得分:8)
对Jonathan的回答进行了概括,这里有一个类别界面,您只需将其粘贴到Xcode项目中的相应文件中即可:
@interface NSTextView (FrameworkAdditions)
- (IBAction)decrementFontSize:(id)sender;
- (IBAction)incrementFontSize:(id)sender;
@end
相应的实施:
@implementation NSTextView (FrameworkAdditions)
- (void)changeFontSize:(CGFloat)delta;
{
NSFontManager * fontManager = [NSFontManager sharedFontManager];
NSTextStorage * textStorage = [self textStorage];
[textStorage beginEditing];
[textStorage enumerateAttribute:NSFontAttributeName
inRange:NSMakeRange(0, [textStorage length])
options:0
usingBlock:^(id value,
NSRange range,
BOOL * stop)
{
NSFont * font = value;
font = [fontManager convertFont:font
toSize:[font pointSize] + delta];
if (font != nil) {
[textStorage removeAttribute:NSFontAttributeName
range:range];
[textStorage addAttribute:NSFontAttributeName
value:font
range:range];
}
}];
[textStorage endEditing];
[self didChangeText];
}
- (IBAction)decrementFontSize:(id)sender;
{
[self changeFontSize:-1.0];
}
- (IBAction)incrementFontSize:(id)sender;
{
[self changeFontSize:1.0];
}
@end
答案 2 :(得分:2)
注意:我假设您使用的是NSTextView,并且您可以访问其文本存储(NSTextStorage)。
我认为不可能仅在使用多种字体的文本上更改字体大小。在NSAttributedString中,font的大小是NSFontAttributeName属性的一部分,它控制字体和大小。
一种解决方案是迭代选择并使用attribute:atIndex:longestEffectiveRange:inRange:
捕获每个字体应用的范围,更改字体的大小,然后使用addAttribute:value:range:
在范围内设置新字体。
<强>更新强>:
如果您查看GNUstep GUI source code for NSTextView(在LGPL下),您将看到它们的实现使用范围迭代。
答案 3 :(得分:2)
这会使字体大小翻倍,但您可以将scale属性更改为任意值,或提供固定大小
NSFont * font = ...;
CGFloat fontSize = [[font fontDescriptor].fontAttributes[NSFontSizeAttribute] floatValue];
font = [NSFont fontWithDescriptor:[font fontDescriptor] size:fontSize * 2.];
self.textField.font = font;
答案 4 :(得分:1)
由于NSTextView
是NSView
的子类,因此您可以使用-scaleUnitSquareToSize:
更改文本视图的放大级别。例如,要将所有文本设置为双倍大小,请调用:
[textView scaleUnitSquareToSize:NSMakeSize(2.0, 2.0)];
执行此操作后,您可能需要对文本视图NSTextContainer
的尺寸进行一些调整,以确保文本的布局正确。