5

我有一个字符串,

NSSting *myString=@"First Second Third Fourth Fifth Sixth Seventh";

我想在具有不同字体类型和颜色的单个标签中显示此字符串。

IE。,

“第一个”字符串应为粗体。

“第二个”字符串应该是斜体。

“第三”字符串应为红色。

“第四”字符串应为绿色。

“Fifth”字符串应该是系统字体的粗斜体。

“Sixth”字符串应该是 arial 粗体。

“Seventh”字符串应该是大小为 34 的 arial 粗体。

我已经浏览了stackoverflow中的一些答案,但我没有得到任何明确的答案..

任何人都可以提供一些指导方针。

提前致谢。

解决方案:首先NSAttributedString根据您的要求进行操作。

使用NSAttributedString你可以做到这iOS 6 UILabel一点attributedString property

Below ios 6.0使用TTAtributeLabel或任何third party attributedLabel 用于displaying attributedString.

4

6 回答 6

3

使用此代码为不同的单词设置不同的颜色..

NSString *test = @"First Second Third Fourth Fifth Sixth Seventh";

 CFStringRef string =  (CFStringRef) test;
    CFMutableAttributedStringRef attrString = CFAttributedStringCreateMutable(kCFAllocatorDefault, 0);
    CFAttributedStringReplaceString (attrString,CFRangeMake(0, 0), string);



    /*
     Note: we could have created CFAttributedStringRef which is non mutable, then we would have to give all its
     attributes right when we create it. We can change them if we use mutable form of CFAttributeString.
     */



    //Lets choose the colors we want to have in our string
    CGColorRef _orange=[UIColor orangeColor].CGColor;
    CGColorRef _green=[UIColor greenColor].CGColor;
    CGColorRef _red=[UIColor redColor].CGColor;
    CGColorRef _blue=[UIColor blueColor].CGColor;    




    //Lets have our string with first 20 letters as orange
    //next 20 letters as green
    //next 20 as red
    //last remaining as blue
    CFAttributedStringSetAttribute(attrString, CFRangeMake(0, 20),kCTForegroundColorAttributeName, _orange);
    CFAttributedStringSetAttribute(attrString, CFRangeMake(20, 20),kCTForegroundColorAttributeName, _green);
    CFAttributedStringSetAttribute(attrString, CFRangeMake(40, 20),kCTForegroundColorAttributeName, _red);    
    CFAttributedStringSetAttribute(attrString, CFRangeMake(60, _stringLength-61),kCTForegroundColorAttributeName, _blue);

您也可以使用图像设置颜色,如下所示..

[yourLable setTextColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"yourImageName"]]];

从此链接查看我的另一个答案

于 2013-05-08T11:41:25.020 回答
2

TTTAttributedLabel在 iOS < 6 上为我完成了这项工作。

于 2013-05-08T12:14:04.710 回答
1

如果你不使用 NSAttributeLabel 然后 试试这个,它对我来说很好

将此方法添加到 CommonFuction 类中并添加此框架CoreText.framework

+ (void)setMultiColorAndFontText:(NSString *)text rangeString:(NSArray *)rangeString label:(UILabel*) label font:(NSArray*) fontName color:(NSArray*) colorName
{
    label.layer.sublayers = nil;
    
    NSMutableAttributedString *mutableAttributedString = [[ NSMutableAttributedString alloc]initWithString:text];
    
    for (int i =0 ; i<[rangeString count]; i++)
    {
        CTFontRef  ctFont = CTFontCreateWithName((__bridge CFStringRef) [UIFont fontWithName:[fontName objectAtIndex:i] size:10.0].fontName, [UIFont fontWithName:[fontName objectAtIndex:i] size:10.0].pointSize, NULL);
        
        NSRange whiteRange = [text rangeOfString:[rangeString objectAtIndex:i]];
        
        if (whiteRange.location != NSNotFound)
        {
            [mutableAttributedString addAttribute:(NSString *)kCTForegroundColorAttributeName value:(id)[colorName objectAtIndex:i] range:whiteRange];
            [mutableAttributedString addAttribute:(NSString*)kCTFontAttributeName
                                            value:( __bridge id)ctFont
                                            range:whiteRange];
        }
    }
    
    CGSize expectedLabelSize = [text sizeWithFont:[UIFont fontWithName:@"HelveticaNeue-CondensedBold" size:10.0f] constrainedToSize:CGSizeMake(186,100) lineBreakMode:UILineBreakModeWordWrap];
    
    CATextLayer   *textLayer = [[CATextLayer alloc]init];
    textLayer.frame =CGRectMake(0,0, label.frame.size.width,expectedLabelSize.height+4);
    textLayer.contentsScale = [[UIScreen mainScreen] scale];
    textLayer.string=mutableAttributedString;
    textLayer.opacity = 1.0;
    textLayer.alignmentMode = kCAAlignmentLeft;
    [label.layer addSublayer:textLayer];
    [textLayer setWrapped:TRUE];
    
    //label.lineBreakMode = UILineBreakModeWordWrap;
    
    label.text = @"";
}

并在调用此方法后如下:-

[CommonFunctions setMultiColorAndFontText:string rangeString:[NSArray arrayWithObjects:str1,str2,str3,str4,str5,str6, nil] label:yourLabel font:[NSArray arrayWithObjects:@"Arial",@"Arial",@"Arial",@"Arial",@"Arial",@"Arial"nil] color:[NSArray  arrayWithObjects:(UIColor *)[UIColor colorWithRed:(0/255.f) green:(167/255.f) blue:(230/255.f) alpha:1.0f].CGColor,(UIColor *)[UIColor colorWithRed:(189/255.f) green:(189/255.f) blue:(189/255.f) alpha:1.0f].CGColor, color3,color4,color5,color6,nil]];
于 2013-05-08T13:01:14.847 回答
1

在 iOS 6.0 及更高版本UILabel中有一个属性:
@property(nonatomic,copy) NSAttributedString *attributedText
接受一个NSAttributedString.

您可以创建一个NSAttributedString符合您要求的。

于 2013-05-08T11:35:39.530 回答
0

我在开发时遇到了同样的问题。因为 NSAttributeString 在上面的 ioS6 n 以上工作。我建议您创建自定义 UILabel 支持自定义标签,而不是获取第三方类。简而言之,通过分配创建许多标签(逐字)颜色,粗体,长度。并将所有标签附加在一起并创建一个新的标签对象

于 2013-05-08T13:26:19.917 回答
0

尝试:

DAAttributedStringUtils

也看到这个

不同的标签

于 2013-05-08T11:40:41.753 回答