как изменить регистр символов в Upper в NSAttributedString - PullRequest
8 голосов
/ 16 июля 2011

Я хочу преобразовать NSAttributedString, содержащую RTFD, в верхний регистр без потери атрибутов существующих символов и графики.

Спасибо

1 Ответ

8 голосов
/ 18 июля 2011

РЕДАКТИРОВАТЬ:

@ fluidsonic Верно, что исходный код неверен.Ниже представлена ​​обновленная версия в Swift, которая заменяет текст в каждом диапазоне атрибутов версией в верхнем регистре строки в этом диапазоне.

extension NSAttributedString {
    func uppercased() -> NSAttributedString {

        let result = NSMutableAttributedString(attributedString: self)

        result.enumerateAttributes(in: NSRange(location: 0, length: length), options: []) {_, range, _ in
            result.replaceCharacters(in: range, with: (string as NSString).substring(with: range).uppercased())
        }

        return result
    }
}

Исходный ответ:

- (NSAttributedString *)upperCaseAttributedStringFromAttributedString:(NSAttributedString *)inAttrString {
    // Make a mutable copy of your input string
    NSMutableAttributedString *attrString = [inAttrString mutableCopy];

    // Make an array to save the attributes in
    NSMutableArray *attributes = [NSMutableArray array];

    // Add each set of attributes to the array in a dictionary containing the attributes and range
    [attrString enumerateAttributesInRange:NSMakeRange(0, [attrString length]) options:0 usingBlock:^(NSDictionary *attrs, NSRange range, BOOL *stop) {
        [attributes addObject:@{@"attrs":attrs, @"range":[NSValue valueWithRange:range]}];
    }];

    // Make a plain uppercase string
    NSString *string = [[attrString string]uppercaseString];

    // Replace the characters with the uppercase ones
    [attrString replaceCharactersInRange:NSMakeRange(0, [attrString length]) withString:string];

    // Reapply each attribute
    for (NSDictionary *attribute in attributes) {
        [attrString setAttributes:attribute[@"attrs"] range:[attribute[@"range"] rangeValue]];
    }

    return attrString;
}

Что это делает:

  1. Делает изменчивую копию входной атрибутной строки.
  2. Берет все атрибуты из этой строки и помещает их в массив, чтобы их можно было использовать позже.
  3. Создание простой строки в верхнем регистре с использованием встроенного метода NSString.
  4. Повторное применение всех атрибутов.

...