Как изменить только размер шрифта для всего стиля текста в NSTextView - PullRequest
10 голосов
/ 11 февраля 2010

Мне нужно установить размер текста (например, 42) для выбранного расширенного текста, который использует несколько шрифтов.

Я полагаю, что могу проверить атрибуты каждой группы символов, изменить размер шрифта и вернуть атрибуты обратно, но, глядя на плавающую панель «Шрифт», кажется, что для этого должен быть очень простой и понятный способ. Я что-то упускаю очевидное?

Ответы [ 5 ]

11 голосов
/ 29 января 2011

На 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];

}
8 голосов
/ 24 августа 2011

Обобщая немного ответ Джонатана, вот интерфейс категории, который вы можете просто вставить в соответствующие файлы в вашем проекте 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 голосов
/ 27 февраля 2016

Это удвоит размер шрифта, но вы можете изменить свойство scale на любое значение или указать фиксированный размер

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

    self.textField.font = font;
2 голосов
/ 11 февраля 2010

Примечание : я предполагаю, что вы используете NSTextView и можете получить доступ к его текстовому хранилищу (NSTextStorage).

Я думаю, что невозможно изменить размер шрифта только для текста, который использует несколько шрифтов. В NSAttributedString размер шрифта является частью атрибута NSFontAttributeName, который управляет как шрифтом, так и размером.

Одним из решений является перебор выделения и использование <a href="http://developer.apple.com/Mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSAttributedString_Class/Reference/Reference.html#//apple_ref/doc/uid/20000166-attribute_atIndex_longestEffectiveRange_inRange_" rel="nofollow noreferrer">attribute:atIndex:longestEffectiveRange:inRange:</a> для захвата диапазона при применении каждого шрифта, изменения размера шрифта, а затем с помощью <a href="http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSMutableAttributedString_Class/Reference/Reference.html#//apple_ref/doc/uid/20000169-addAttribute_value_range_" rel="nofollow noreferrer">addAttribute:value:range:</a> установите новый шрифт в диапазоне.

Обновление

Если вы посмотрите на исходный код GNUstep GUI для NSTextView (под LGPL), вы увидите, что в их реализации используется итерация диапазона.

1 голос
/ 12 февраля 2010

Поскольку NSTextView является подклассом NSView, вы можете использовать -scaleUnitSquareToSize:, чтобы изменить уровень увеличения текстового представления. Например, чтобы сделать весь текст в двойном размере, вы бы позвонили:

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

После выполнения этой операции вам может потребоваться внести некоторые изменения в размеры текстового представления NSTextContainer, чтобы обеспечить правильное расположение текста.

...