显示UILabel

时间:2015-06-16 05:20:12

标签: ios objective-c iphone fractions

我正在开发应用程序,我必须在标签上显示分数。

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。我想像这样展示⅕。

我尝试使用属性字符串,但它不起作用。

任何人都可以帮助我。

提前致谢。

5 个答案:

答案 0 :(得分:4)

我创建了以下两个辅助函数,它们将以下标或上标格式返回给定数字(0-9)的unicode字符串:

-(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的屏幕截图:

From the simulator

修改

这是一个适用于任何分数的函数,包括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]);

记录³⁷/₁₀₀

答案 1 :(得分:2)

如果您只想使用非常常见的分数,请使用其标准的Unicode字符,如其他答案中所述。

或者,要获得任意分数,您可能需要对Unicode中的上标和下标小数的所有字符进行硬编码。还有一个特殊的分数斜杠。

下面的代码会将NSString分子和NSString分母转换为像¹³/ 5这样的分数。可以轻松修改为使用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 @"";
}

答案 2 :(得分:1)

我不知道是否有任何其他解决方案可以在“普通”UILabel中出现摩擦,但您可以创建自己的。

从UIView创建新的类扩展,并在其间绘制两个字符串和行。

您可以使用

[str drawAtPoint:CGPointMake(x,y)]

比你刚写一个set方法,它取两个数字或setter作为十进制数,而不是你把它转换成摩擦。

- (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)] ;
}

或使用类似this的内容:

- (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);
}

这是一个快速示例,需要根据您的意愿进行配置,但这是您可以从哪里开始。

答案 3 :(得分:0)

您可以通过将UILabel's文本属性设置为1/2的Unicode来实现它:

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

另见下面链接
NSString: Looking for Unicode for superscript: 1, 2, 3
可能对你有所帮助。 享受;)

答案 4 :(得分:0)

尝试将标签的text属性设置为Unicode 1/5:

label.text = [NSString stringWithFormat:@"%C",0x2155];