Отображать номер дроби в UILabel

Я работаю над приложением, в котором я должен показывать номер дроби на этикетке.

NSMutableAttributedString   * hogan = [[NSMutableAttributedString alloc] initWithString:self.toValue];
  [hogan setAttributes:@{NSFontAttributeName:[UIFont fontWithName:@"DINPro-Bold" size:11.0]} range:NSMakeRange(9,6)];
  UILabel *fal = [[UILabel alloc] initWithFrame:CGRectMake(100,12, 150.0, 50)];
 fal.text = @"";
 fal.textColor = [UIColor whiteColor];

 fal.backgroundColor = [UIColor redColor];
  fal.font = [UIFont fontWithName:@"DINPro-Bold" size:18.0];



fal.attributedText=hogan;
[self addSubview:fal];

и выход этого кода 1/5. Я хочу показать вот так ⅕.

Я пробовал со строкой атрибута, но это не работает.

Может кто-нибудь мне помочь.

Заранее спасибо.


person Community    schedule 16.06.2015    source источник
comment
Что именно вы имеете в виду под не работает? Не могли бы вы поделиться кодом, который вы пробовали, пожалуйста?   -  person Peter Tutervai    schedule 16.06.2015


Ответы (5)


Я создал следующие две вспомогательные функции, которые будут возвращать строку юникода для заданного числа (0-9) в формате нижнего или верхнего индекса:

-(NSString *)superscript:(int)num {

    NSDictionary *superscripts = @{@0: @"\u2070", @1: @"\u00B9", @2: @"\u00B2", @3: @"\u00B3", @4: @"\u2074", @5: @"\u2075", @6: @"\u2076", @7: @"\u2077", @8: @"\u2078", @9: @"\u2079"};
    return superscripts[@(num)];
}

-(NSString *)subscript:(int)num {

    NSDictionary *subscripts = @{@0: @"\u2080", @1: @"\u2081", @2: @"\u2082", @3: @"\u2083", @4: @"\u2084", @5: @"\u2085", @6: @"\u2086", @7: @"\u2087", @8: @"\u2088", @9: @"\u2089"};
    return subscripts[@(num)];
}

Как только вы объявите их, вы можете легко вызвать что-то вроде этого:

NSLog(@"%@/%@", [self superscript:5], [self subscript:6]);

Что выведет следующее:

⁵/₆

И даже скриншот для тебя с моей обычной UILabel:

Из симулятора

ИЗМЕНИТЬ

Вот функция, которая будет работать с любой дробью, включая 37/100, например:

-(NSString *)fraction:(int)numerator denominator:(int)denominator {

    NSMutableString *result = [NSMutableString string];

    NSString *one = [NSString stringWithFormat:@"%i", numerator];
    for (int i = 0; i < one.length; i++) {
        [result appendString:[self superscript:[[one substringWithRange:NSMakeRange(i, 1)] intValue]]];
    }
    [result appendString:@"/"];

    NSString *two = [NSString stringWithFormat:@"%i", denominator];
    for (int i = 0; i < two.length; i++) {
        [result appendString:[self subscript:[[two substringWithRange:NSMakeRange(i, 1)] intValue]]];
    }
    return result;
}

Вызов следующего:

NSLog(@"%@", [self fraction:37 denominator:100]);

Журналы ³⁷/₁₀₀.

person rebello95    schedule 16.06.2015
comment
О, да ладно… он дал вам ответ… не могли бы вы хотя бы попытаться разобраться в этом сами? - person Ashley Mills; 16.06.2015
comment
@Bhumika Смотрите мою правку. Вам просто нужно перебирать цифры. - person rebello95; 16.06.2015

Если вы хотите использовать только очень распространенные дроби, используйте их стандартные символы Unicode, как указано в других ответах.

Или, чтобы получить произвольную дробь, вы можете жестко закодировать все символы для надстрочных и подстрочных десятичных знаков из Unicode. Также есть специальный дробный слеш.

Приведенный ниже код преобразует числитель NSString и знаменатель NSString в дробь типа ¹³⁄₅. Может быть легко изменен для использования NSNumberFormatter.

// Constants for the different Unicode charcodes, where the nth array 
// member is for the digit n.
NSArray *superscriptDigits = @[@"\u2070",
                               @"\u00b9",
                               @"\u00b2",
                               @"\u00b3",
                               @"\u2074",
                               @"\u2075",
                               @"\u2076",
                               @"\u2077",
                               @"\u2078",
                               @"\u2079"];
NSArray *subscriptDigits = @[@"\u2080",
                             @"\u2081",
                             @"\u2082",
                             @"\u2083",
                             @"\u2084",
                             @"\u2085",
                             @"\u2086",
                             @"\u2087",
                             @"\u2088",
                             @"\u2089"];
NSString *slashCharacter = @"\u2044";

+(NSString *)fractionStringFromDenominator:(NSString *)denominatorString
                                 numerator:(NSString *)numeratorString {

    NSMutableString *fractionString = [NSMutableString new];

    for (int i = 0; i < denominatorString.length; i++) {
        unichar c = [denominatorString characterAtIndex:i];
        [fractionString appendFormat:@"%@", [self unicodeForDigitChar:c subscript:NO]];
    }

    [fractionString appendFormat:@"%@", slashCharacter];

    for (int i = 0; i < numeratorString.length; i++) {
        unichar c = [numeratorString characterAtIndex:i];
        [fractionString appendFormat:@"%@", [self unicodeForDigitChar:c subscript:YES]];
    }

    return fractionString;
}


+(NSString *)unicodeForDigitChar:(unichar)c subscript:(bool)subscript {
    if (c >= '0' && c <= '9') {
        return subscript ? subscriptDigits[c - '0'] : superscriptDigits[c - '0'];
    }
    // Not a standard digit character
    return @"";
}
person Corwin Newall    schedule 16.06.2015

Я не знаю, есть ли какое-либо другое решение, чтобы иметь трения внутри «нормального» UILabel, но вы можете создать свое собственное.

Создайте новый класс, расширяющий UIView, и нарисуйте две строки и линию между ними.

Ты можешь использовать

[str drawAtPoint:CGPointMake(x,y)]

Затем вы просто пишете метод набора, который принимает два числа или установщик для десятичного числа, а затем конвертируете это в трение.

- (void) setFractionValue: (NSNumber * ) a divider: (NSNumber * ) b {

    // Draw fraction a/b
    [[NSString stringWithFormat:@"%@", a] drawAtPoint:CGPointMake(x,y1)] ;
    [[NSString stringWithFormat:@"%@", b] drawAtPoint:CGPointMake(x,y2)] ;
}

или используйте что-то вроде это:

- (void) setDecimalValue: (NSNumber *) decimal {

    // convert decimal to fraction 
    // get a and b from fraction
    // Draw fraction a/b
    [[NSString stringWithFormat:@"%@", a] drawAtPoint:CGPointMake(x,y1)] ;
    [[NSString stringWithFormat:@"%@", b] drawAtPoint:CGPointMake(x,y2)] ;

}

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


Вариант использования:

 @implementation TestDrawText


- (void)drawRect:(CGRect)rect {

    [super drawRect:rect];



    [self drawText:rect.origin.x + 10 yPosition:rect.origin.x + 10 text:@"2"];

    [self drowLine:rect.origin.x + 11 yPosition:rect.origin.x + 30];

    [self drawText:rect.origin.x + 20 yPosition:rect.origin.x + 20 text:@"5"];
}

- (void)drawText:(CGFloat)xPosition yPosition:(CGFloat)yPosition text: (NSString * ) text{

    CGPoint point = CGPointMake(xPosition, yPosition);
    NSDictionary* textFontAttributes = @{NSFontAttributeName: [UIFont fontWithName: @"Helvetica" size: 12], NSForegroundColorAttributeName: UIColor.redColor};
    [text drawAtPoint:point withAttributes:textFontAttributes];
}

- (void) drowLine:(CGFloat)xPosition yPosition:(CGFloat)yPosition {

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);

    // Draw them with a 2.0 stroke width so they are a bit more visible.
    CGContextSetLineWidth(context, 2.0f);

    CGContextMoveToPoint(context, xPosition, yPosition); //start at this point

    CGContextAddLineToPoint(context, xPosition + 15, yPosition - 15); //draw to this point

    // and now draw the Path!
    CGContextStrokePath(context);
}

Это быстрый пример, и его нужно настроить в соответствии с вашими пожеланиями, но это начало, с которого вы могли бы пойти.

person Marko Zadravec    schedule 16.06.2015
comment
Привет, Марко, я пытался следовать твоему пути. Я создал подкласс UIView с двумя строками, представленными для числителя и знаменателя, и всплеска. Нужно ли мне переопределять функцию drawRect? если да, то как бы я это сделал? Спасибо - person Hoang Minh; 22.10.2015

Вы можете добиться этого, установив для свойства UILabel's text значение Unicode 1/2:

myLblName.text = [NSString stringWithFormat:@"%C",0x00bd];

А также см. ссылку ниже
NSString: поиск Unicode для верхний индекс: 1, 2, 3
Может оказаться полезным для вас. Наслаждаться ;)

person iPatel    schedule 16.06.2015
comment
Но мое значение всегда динамическое. Тогда как оно будет работать, как здесь, вы знаете, что 1/2 юникода равно 0x00bd. Но что, если значение динамическое - person ; 16.06.2015
comment
Пожалуйста, проверьте.. stackoverflow.com /вопросы/24913046/ - person iPatel; 16.06.2015

Попробуйте установить для свойства text метки значение Unicode 1/5:

label.text = [NSString stringWithFormat:@"%C",0x2155];
person Kishore Suthar    schedule 16.06.2015
comment
Но мое значение всегда динамическое. Тогда как оно будет работать, как здесь, вы знаете, что 1/2 юникода равно 0x00bd. Но что, если значение динамическое - person ; 16.06.2015