在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。 我想要像这样展示⅕。
我曾尝试使用属性string,但它不起作用。
谁能帮帮我吗。
提前致谢。
我创build了以下两个帮助函数,它们将以下标或上标格式返回给定数字(0-9)的unicodestring:
-(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
ya截图:
编辑
这个函数可以和任何分数一起使用,包括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]);
对³⁷/₁₀₀
。
如果您只想使用非常常见的分数,请使用其标准Unicode字符,如其他答案中所述。
或者,为了得到一个任意的分数,你可能想要硬编码所有的字符为Unicode和上标和下标小数。 还有一个特殊的分数斜线。
下面的代码将把NSString
分子和NSString
分母转换成像13 3/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 @""; }
我不知道是否有任何其他的解决scheme,以“正常”UILabel内摩擦,但你可以创build自己的。
从UIView中创build新的类,并在两者之间绘制两个string和一行。
您可以使用
[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); }
这是一个很快的例子,需要根据您的意愿进行configuration,但是您可以从哪里开始。
你可以通过将UILabel's
文本属性设置为Unicode的1/2来实现:
myLblName.text = [NSString stringWithFormat:@"%C",0x00bd];
也看下面的链接
NSString:寻找上标的Unicode:1,2,3
可能对你有帮助。 请享用 ;)
尝试将标签的文本属性设置为1/5的Unicode:
label.text = [NSString stringWithFormat:@"%C",0x2155];