Подтвердить что ты не робот

Как сделать индексы и верхние индексы с помощью NSAttributedString?

Мне нужно сделать индексы для формул химии (H2O, Na ^ 2 + и т.д.)?

Возможно ли это с NSAttributedString или есть альтернативный/более простой способ создания индексов?

4b9b3361

Ответ 1

Это возможно сделать с NSAttributedString. Константа атрибута, которую вы ищете, зависит от вашей платформы. Для Mac OS X это NSSuperscriptAttributeName, а для iOS - kCTSuperscriptAttributeName. Передайте отрицательное значение для индекса.

Единственное предостережение в том, что UILabel на iOS не может нарисовать NSAttributedString (все же пальцы скрещены для iOS 6). Вам нужно будет нарисовать текст с помощью Core Text или найти замену третьей стороны для UILabel, которая может нарисовать NSAttributedString.

Ответ 2

Вот что я сделал в iOS 6. Сначала добавьте рамки CoreText и QuartzCore. Затем импортируйте:

#import <QuartzCore/QuartzCore.h>
#import <CoreText/CTStringAttributes.h>
#import <CoreText/CoreText.h>

Я сделал небольшую функцию, которая вводит простой NSString и экспортирует NSMutableAttributedString с последним символом в надстроке. Это можно изменить, чтобы установить надстрочный индекс или индекс, измените значение kCTSuperscriptAttributeName на -1. Также вы можете добавить переменную, чтобы указать, куда помещать верхний индекс в строку. Сейчас он просто принимает конец строки.

- (NSMutableAttributedString *)plainStringToAttributedUnits:(NSString *)string;
{
    NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:string];
    UIFont *font = [UIFont systemFontOfSize:10.0f];
    UIFont *smallFont = [UIFont systemFontOfSize:9.0f];

    [attString beginEditing];
    [attString addAttribute:NSFontAttributeName value:(font) range:NSMakeRange(0, string.length - 2)];
    [attString addAttribute:NSFontAttributeName value:(smallFont) range:NSMakeRange(string.length - 1, 1)];
    [attString addAttribute:(NSString*)kCTSuperscriptAttributeName value:@"1" range:NSMakeRange(string.length - 1, 1)];
    [attString addAttribute:(NSString*)kCTForegroundColorAttributeName value:[UIColor blackColor] range:NSMakeRange(0, string.length - 1)];
    [attString endEditing];
    return attString;
}

Теперь, когда я хочу использовать его, я могу сделать следующее, чтобы поместить его в UITextField:

    NSString *qlwUnitsPlainText = @"m3";
    self.quantityLoadWeightUnits_textField.attributedText = [self plainStringToAttributedUnits:qlwUnitsPlainText];

Надеюсь, это поможет кому-то еще, там не так много примеров!

Ответ 3

В iOS я пропустил константу kCTSuperscriptAttributeName, но имел хорошие результаты с размером шрифта и базовым уровнем. Это дает вам немного больше контроля для менее послушных шрифтов:

+ (NSAttributedString *)attributedStringForText:(NSString *)normalText andSuperscript:(NSString *)superscriptText textSize:(CGFloat)textSize
{
    UIFont *normalFont = [Styles mainFontWithSize:textSize];
    UIFont *superFont = [Styles mainFontWithSize:textSize / 2];

    NSMutableAttributedString *finalStr = [[NSMutableAttributedString alloc] initWithString:normalText attributes:@{NSFontAttributeName: normalFont}];

    NSAttributedString *superStr = [[NSAttributedString alloc] initWithString:superscriptText attributes:@{NSFontAttributeName: superFont, NSBaselineOffsetAttributeName:@(textSize/2)}];

    [finalStr appendAttributedString:superStr];

    return finalStr;
}       

Ответ 4

вы также можете сделать следующее, если вы хотите сделать его чище litle

NSDictionary *attr = @{ NSFontAttributeName: smallfont, 
                        (NSString*)kCTSuperscriptAttributeName: @1 }

NSRange fabricWeightRange = NSMakeRange(fabricWeight.location + 2, 1);                   
[subKeyString setAttributes:attr range:fabricWeightRange];

Ответ 5

Для значения использования SubScript для kCTSuperscriptAttributeName как @-1.

В соответствии с документом

@discussion Значение должно быть CFNumberRef. Значение по умолчанию - значение int 0. Если поддержанный                 по указанному шрифту, значение 1 допускает создание надписей и                 значение -1 позволяет подписи.

extern const CFStringRef kCTSuperscriptAttributeName CT_AVAILABLE (10_5, 3_2);

 Example- [lblHeader setText:@"Headers [Alpha1 – text"];

        NSMutableAttributedString *headerSubscript = [[NSMutableAttributedString alloc]initWithAttributedString: lblHeader.attributedText];

        [headerSubscript addAttribute:(NSString *)kCTSuperscriptAttributeName value:@-1 range:NSMakeRange(14,1)];      

        [lblHeader setAttributedText:headerSubscript];