我正在开发应用程序,我必须在标签上显示分数。
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。我想像这样展示⅕。
我尝试使用属性字符串,但它不起作用。
任何人都可以帮助我。
提前致谢。
答案 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
的屏幕截图:
修改强>
这是一个适用于任何分数的函数,包括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];