Как сделать подписки и верхние индексы, используя NSAttributedString? - PullRequest
25 голосов
/ 19 декабря 2011

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

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

Ответы [ 5 ]

33 голосов
/ 08 февраля 2013

Вот что я сделал в 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];

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

28 голосов
/ 19 декабря 2011

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

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

8 голосов
/ 06 октября 2014

На 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;
}       
0 голосов
/ 27 августа 2015

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

Согласно документу

@ обсуждение Значение должно быть 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];
0 голосов
/ 07 ноября 2013

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

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

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