Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何在NSTextView中仅更改整个样式文本的字体大小_Objective C_Cocoa_Macos_Nstextview - Fatal编程技术网

Objective c 如何在NSTextView中仅更改整个样式文本的字体大小

Objective c 如何在NSTextView中仅更改整个样式文本的字体大小,objective-c,cocoa,macos,nstextview,Objective C,Cocoa,Macos,Nstextview,我需要设置使用多种字体的选定富文本的文本大小(例如设置为42) 我想我可以检查每组字符的属性,修改字体大小并设置属性,但看看浮动字体面板,似乎应该有一个非常简单和直接的方法来实现这一点。我是否遗漏了一些明显的内容?注意:我假设您使用的是NSTextView,并且您可以访问它的文本存储(NSTextStorage) 我认为在使用多种字体的文本上只更改字体大小是不可能的。在NSAttributeString中,字体大小是控制字体和大小的NSFontAttributeName属性的一部分 一种解决方案

我需要设置使用多种字体的选定富文本的文本大小(例如设置为42)


我想我可以检查每组字符的属性,修改字体大小并设置属性,但看看浮动字体面板,似乎应该有一个非常简单和直接的方法来实现这一点。我是否遗漏了一些明显的内容?

注意:我假设您使用的是NSTextView,并且您可以访问它的文本存储(NSTextStorage)

我认为在使用多种字体的文本上只更改字体大小是不可能的。在NSAttributeString中,字体大小是控制字体和大小的NSFontAttributeName属性的一部分

一种解决方案是迭代选择并使用
捕获应用每个字体时的范围,更改字体大小,然后使用
在该范围内设置新字体

更新


如果查看(在LGPL下),您将看到它们的实现使用了范围迭代。

由于
NSTextView
NSView
的一个子类,您可以使用
-scaleUnitSquareToSize:
更改文本视图的放大级别。例如,要使所有文本的大小加倍,请调用:

[textView scaleUnitSquareToSize:NSMakeSize(2.0, 2.0)];

执行此操作后,您可能需要对文本视图的
NSTextContainer
的尺寸进行一些调整,以确保文本布局正确。

在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];

}

概括一下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

这将使字体大小加倍,但您可以将“缩放”属性更改为任何值,或提供固定大小

    NSFont * font = ...;
    CGFloat fontSize =  [[font fontDescriptor].fontAttributes[NSFontSizeAttribute] floatValue];
    font = [NSFont fontWithDescriptor:[font fontDescriptor] size:fontSize * 2.];

    self.textField.font = font;

是的,这是我第一个想到的。但是已经有一种机制可以使文本变大或变小。如果某个菜单项或滑块的标记为3(或4),并向NSFontManager发送modifyFont:消息,则NSFontManager会与NSTextView对话,并将文本大小更改为较小或较大的值(并保留字体、样式等)。这是自动完成的。所以我想我很想加入这个机制,但就是不知道在哪里可以做到。如果可能的话。有一个内置的mecanism只在NSText实例和NSFontManager之间工作(请参阅)。基本上,当FontPanel更改字体(大小或特征)时,它会向响应者链发送changeFont:消息。如果找到响应程序,它将向FontManager发送每个文本范围的convertFont:消息。如果不使用FontPanel,恐怕您必须复制内部所做的操作……是的,似乎是这样。我最终使用了attribute:atIndex:longestEffectiveRange:inRange:和convertFont:toSize:但奇怪的是,没有一个简单的方法来设置字体大小(考虑到有增加或减少字体大小的方法,我可以使用,但我不需要)。谢谢你,Laurent。我只需要真正更改字体大小,而不是缩放视图,但无论如何,谢谢你,我不知道这个方法存在。@Rob这太棒了!这正是我需要的,而不是我认为需要的(例如,枚举字体属性以更改其相对大小,这可能会激怒用户并产生其他问题)。这对我来说很有效,看起来比其他答案更简单。这里有一个Swift 3版本
font=NSFont.init(描述符:font.fontDescriptor,大小:…)