代码之家  ›  专栏  ›  技术社区  ›  Brock Woolf

如何使用nsattributedstring?

  •  302
  • Brock Woolf  · 技术社区  · 14 年前

    一个 nsstring nsmutableStrings中有多种颜色是不可能的。因此,我听说了一点关于 nsattributedstring which was introduced with the ipad sdk 3.2<(or around 3.2)and is available on the iPhone从iPhone SDK 4.0测试版开始。

    我想要一根有三种颜色的绳子。

    我不使用3个单独的nsstring的原因是,这三个nsstring中的每一个的长度都会经常变化,因此我更喜欢,不使用任何计算来重新定位3个单独的nsstring nsstring objects.

    如果可能,请使用 nsattributedString How do I make the following-(if not possible with nsattributed string how would you do it):。

    编辑: 记住, >“First” , >“Second” and >“Third” will be replaced by other strings at any time.因此,使用硬编码的nsrange值是行不通的。 不可能。所以我听说过 NSAttributedString 它是随着 iPad SDK 3.2 (或3.2左右),从开始在iPhone上提供 iPhone SDK 4.0测试版 .

    我想要一根有三种颜色的绳子。

    我不使用3个单独的nsstring的原因是这三个nsstring的长度 NSattributedString 子字符串经常更改,因此我希望不要使用任何计算来重新定位3个单独的 非字符串 物体。

    如果可以使用 NSattributedString 如何进行以下操作(如果不可能使用nsattributed string,您将如何进行):

    alt text

    编辑: 记得, @"first" , @"second" @"third" 任何时候都将被其他字符串替换。所以使用硬编码的nsrange值是行不通的。

    15 回复  |  直到 6 年前
        1
  •  473
  •   Dave DeLong    14 年前

    在构建属性化字符串时,我更喜欢使用可变的子类,只是为了保持内容的整洁。

    也就是说,下面是创建三色属性字符串的方法:

    NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString:@"firstsecondthird"];
    [string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0,5)];
    [string addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(5,6)];
    [string addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(11,5)];
    

    在浏览器中键入。 实施者注意事项

    显然,您不会在这样的范围内硬编码。也许相反,你可以做一些类似的事情:

    NSDictionary * wordToColorMapping = ....;  //an NSDictionary of NSString => UIColor pairs
    NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString:@""];
    for (NSString * word in wordToColorMapping) {
      UIColor * color = [wordToColorMapping objectForKey:word];
      NSDictionary * attributes = [NSDictionary dictionaryWithObject:color forKey:NSForegroundColorAttributeName];
      NSAttributedString * subString = [[NSAttributedString alloc] initWithString:word attributes:attributes];
      [string appendAttributedString:subString];
      [subString release];
    }
    
    //display string
    
        2
  •  115
  •   MGM    10 年前

    问题已经回答了…但是我想演示如何添加阴影和使用nsattributedstring更改字体,这样当人们搜索这个主题时,他们就不必一直寻找。

    #define FONT_SIZE 20
    #define FONT_HELVETICA @"Helvetica-Light"
    #define BLACK_SHADOW [UIColor colorWithRed:40.0f/255.0f green:40.0f/255.0f blue:40.0f/255.0f alpha:0.4f]
    
    NSString*myNSString = @"This is my string.\nIt goes to a second line.";                
    
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
                   paragraphStyle.alignment = NSTextAlignmentCenter;
                 paragraphStyle.lineSpacing = FONT_SIZE/2;
                         UIFont * labelFont = [UIFont fontWithName:FONT_HELVETICA size:FONT_SIZE];
                       UIColor * labelColor = [UIColor colorWithWhite:1 alpha:1];
                           NSShadow *shadow = [[NSShadow alloc] init];
                     [shadow setShadowColor : BLACK_SHADOW];
                    [shadow setShadowOffset : CGSizeMake (1.0, 1.0)];
                [shadow setShadowBlurRadius : 1];
    
    NSAttributedString *labelText = [[NSAttributedString alloc] initWithString : myNSString
                          attributes : @{
       NSParagraphStyleAttributeName : paragraphStyle,
                 NSKernAttributeName : @2.0,
                 NSFontAttributeName : labelFont,
      NSForegroundColorAttributeName : labelColor,
               NSShadowAttributeName : shadow }];
    

    这是一个快速版本…

    警告! 这对4s有效。

    对于5s,您必须将所有浮点值更改为双精度值(因为编译器还不能正常工作)。

    字体选择的Swift枚举:

    enum FontValue: Int {
        case FVBold = 1 , FVCondensedBlack, FVMedium, FVHelveticaNeue, FVLight, FVCondensedBold, FVLightItalic, FVUltraLightItalic, FVUltraLight, FVBoldItalic, FVItalic
    }
    

    枚举访问的Swift数组(由于枚举不能使用“-”而需要):

    func helveticaFont (index:Int) -> (String) {
        let fontArray = [
        "HelveticaNeue-Bold",
        "HelveticaNeue-CondensedBlack",
        "HelveticaNeue-Medium",
        "HelveticaNeue",
        "HelveticaNeue-Light",
        "HelveticaNeue-CondensedBold",
        "HelveticaNeue-LightItalic",
        "HelveticaNeue-UltraLightItalic",
        "HelveticaNeue-UltraLight",
        "HelveticaNeue-BoldItalic",
        "HelveticaNeue-Italic",
        ]
        return fontArray[index]
    }
    

    Swift属性文本函数:

    func myAttributedText (myString:String, mySize: Float, myFont:FontValue) -> (NSMutableAttributedString) {
    
        let shadow = NSShadow()
        shadow.shadowColor = UIColor.textShadowColor()
        shadow.shadowOffset = CGSizeMake (1.0, 1.0)
        shadow.shadowBlurRadius = 1
    
        let paragraphStyle = NSMutableParagraphStyle.alloc()
        paragraphStyle.lineHeightMultiple = 1
        paragraphStyle.lineBreakMode = NSLineBreakMode.ByWordWrapping
        paragraphStyle.alignment = NSTextAlignment.Center
    
        let labelFont = UIFont(name: helveticaFont(myFont.toRaw()), size: mySize)
        let labelColor = UIColor.whiteColor()
    
        let myAttributes :Dictionary = [NSParagraphStyleAttributeName : paragraphStyle,
                                                  NSKernAttributeName : 3, // (-1,5)
                                                  NSFontAttributeName : labelFont,
                                       NSForegroundColorAttributeName : labelColor,
                                                NSShadowAttributeName : shadow]
    
        let myAttributedString = NSMutableAttributedString (string: myString, attributes:myAttributes)
    
        // add new color 
        let secondColor = UIColor.blackColor()
        let stringArray = myString.componentsSeparatedByString(" ")
        let firstString: String? = stringArray.first
        let letterCount = countElements(firstString!)
        if firstString {
            myAttributedString.addAttributes([NSForegroundColorAttributeName:secondColor], range:NSMakeRange(0,letterCount))
        }
    
        return  myAttributedString
    }
    

    用于查找字符串数组中范围的第一个和最后一个扩展名:

    extension Array {
        var last: T? {
            if self.isEmpty {
                NSLog("array crash error - please fix")
                return self [0]
            } else {
                return self[self.endIndex - 1]
            }
        }
    }
    
    extension Array {
        var first: T? {
            if self.isEmpty {
                NSLog("array crash error - please fix")
                return self [0]
            } else {
                return self [0]
            }
        }
    }
    

    新颜色:

    extension UIColor {
        class func shadowColor() -> UIColor {
            return UIColor(red: 0.0/255.0, green: 0.0/255.0, blue: 0.0/255.0, alpha: 0.3)
        }
        class func textShadowColor() -> UIColor {
            return UIColor(red: 50.0/255.0, green: 50.0/255.0, blue: 50.0/255.0, alpha: 0.5)
        }
        class func pastelBlueColor() -> UIColor {
            return UIColor(red: 176.0/255.0, green: 186.0/255.0, blue: 255.0/255.0, alpha: 1)
        }
        class func pastelYellowColor() -> UIColor {
            return UIColor(red: 255.0/255.0, green: 238.0/255.0, blue: 140.0/255.0, alpha: 1)
        }
    }
    

    我的宏替换:

    enum MyConstants: Float {
        case CornerRadius = 5.0
    }
    

    带属性文本的我的按钮生成器:

    func myButtonMaker (myView:UIView) -> UIButton {
    
        let myButton = UIButton.buttonWithType(.System) as UIButton
        myButton.backgroundColor = UIColor.pastelBlueColor()
        myButton.showsTouchWhenHighlighted = true;
        let myCGSize:CGSize = CGSizeMake(100.0, 50.0)
        let myFrame = CGRectMake(myView.frame.midX - myCGSize.height,myView.frame.midY - 2 * myCGSize.height,myCGSize.width,myCGSize.height)
        myButton.frame = myFrame
        let myTitle = myAttributedText("Button",20.0,FontValue.FVLight)
        myButton.setAttributedTitle(myTitle, forState:.Normal)
    
        myButton.layer.cornerRadius = myButton.bounds.size.width / MyConstants.CornerRadius.toRaw()
        myButton.setTitleColor(UIColor.whiteColor(), forState: .Normal)
        myButton.tag = 100
        myButton.bringSubviewToFront(myView)
        myButton.layerGradient()
    
        myView.addSubview(myButton)
    
        return  myButton
    }
    

    我的uiview/uilabel maker,带属性文本、阴影和圆角:

    func myLabelMaker (myView:UIView) -> UIView {
    
        let myFrame = CGRectMake(myView.frame.midX / 2 , myView.frame.midY / 2, myView.frame.width/2, myView.frame.height/2)
        let mylabelFrame = CGRectMake(0, 0, myView.frame.width/2, myView.frame.height/2)
    
        let myBaseView = UIView()
        myBaseView.frame = myFrame
        myBaseView.backgroundColor = UIColor.clearColor()
    
        let myLabel = UILabel()
        myLabel.backgroundColor=UIColor.pastelYellowColor()
        myLabel.frame = mylabelFrame
    
        myLabel.attributedText = myAttributedText("This is my String",20.0,FontValue.FVLight)
        myLabel.numberOfLines = 5
        myLabel.tag = 100
        myLabel.layer.cornerRadius = myLabel.bounds.size.width / MyConstants.CornerRadius.toRaw()
        myLabel.clipsToBounds = true
        myLabel.layerborders()
    
        myBaseView.addSubview(myLabel)
    
        myBaseView.layerShadow()
        myBaseView.layerGradient()
    
        myView.addSubview(myBaseView)
    
        return myLabel
    }
    

    常规阴影添加:

    func viewshadow<T where T: UIView> (shadowObject: T)
    {
        let layer = shadowObject.layer
        let radius = shadowObject.frame.size.width / MyConstants.CornerRadius.toRaw();
        layer.borderColor = UIColor.whiteColor().CGColor
        layer.borderWidth = 0.8
        layer.cornerRadius = radius
        layer.shadowOpacity = 1
        layer.shadowRadius = 3
        layer.shadowOffset = CGSizeMake(2.0,2.0)
        layer.shadowColor = UIColor.shadowColor().CGColor
    }
    

    视图样式的视图扩展名:

    extension UIView {
        func layerborders() {
            let layer = self.layer
            let frame = self.frame
            let myColor = self.backgroundColor
            layer.borderColor = myColor.CGColor
            layer.borderWidth = 10.8
            layer.cornerRadius = layer.borderWidth / MyConstants.CornerRadius.toRaw()
        }
    
        func layerShadow() {
            let layer = self.layer
            let frame = self.frame
            layer.cornerRadius = layer.borderWidth / MyConstants.CornerRadius.toRaw()
            layer.shadowOpacity = 1
            layer.shadowRadius = 3
            layer.shadowOffset = CGSizeMake(2.0,2.0)
            layer.shadowColor = UIColor.shadowColor().CGColor
        }
    
        func layerGradient() {
            let layer = CAGradientLayer()
            let size = self.frame.size
            layer.frame.size = size
            layer.frame.origin = CGPointMake(0.0,0.0)
            layer.cornerRadius = layer.bounds.size.width / MyConstants.CornerRadius.toRaw();
    
            var color0 = CGColorCreateGenericRGB(250.0/255, 250.0/255, 250.0/255, 0.5)
            var color1 = CGColorCreateGenericRGB(200.0/255, 200.0/255, 200.0/255, 0.1)
            var color2 = CGColorCreateGenericRGB(150.0/255, 150.0/255, 150.0/255, 0.1)
            var color3 = CGColorCreateGenericRGB(100.0/255, 100.0/255, 100.0/255, 0.1)
            var color4 = CGColorCreateGenericRGB(50.0/255, 50.0/255, 50.0/255, 0.1)
            var color5 = CGColorCreateGenericRGB(0.0/255, 0.0/255, 0.0/255, 0.1)
            var color6 = CGColorCreateGenericRGB(150.0/255, 150.0/255, 150.0/255, 0.1)
    
            layer.colors = [color0,color1,color2,color3,color4,color5,color6]
            self.layer.insertSublayer(layer, atIndex: 2)
        }
    }
    

    实际视图确实具有加载功能:

    func buttonPress (sender:UIButton!) {
        NSLog("%@", "ButtonPressed")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        let myLabel = myLabelMaker(myView)
        let myButton = myButtonMaker(myView)
    
        myButton.addTarget(self, action: "buttonPress:", forControlEvents:UIControlEvents.TouchUpInside)
    
        viewshadow(myButton)
        viewshadow(myLabel)
    
    }
    
        3
  •  32
  •   Denis Kutlubaev    11 年前

    我想,这是一种很方便的使用方法 regular expressions 查找应用属性的范围。我就是这样做的:

    NSMutableAttributedString *goodText = [[NSMutableAttributedString alloc] initWithString:articleText];
    
    NSRange range = [articleText rangeOfString:@"\\[.+?\\]" options:NSRegularExpressionSearch|NSCaseInsensitiveSearch];
    if (range.location != NSNotFound) {
        [goodText addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Georgia" size:16] range:range];
        [goodText addAttribute:NSForegroundColorAttributeName value:[UIColor brownColor] range:range];
    }
    
    NSString *regEx = [NSString stringWithFormat:@"%@.+?\\s", [self.article.titleText substringToIndex:0]];
    range = [articleText rangeOfString:regEx options:NSRegularExpressionSearch|NSCaseInsensitiveSearch];
    if (range.location != NSNotFound) {
        [goodText addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Georgia-Bold" size:20] range:range];
        [goodText addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:range];
    }
    
    [self.textView setAttributedText:goodText];
    

    我在搜索可用属性的列表,但没有在这里和类引用的第一页中找到它们。所以我决定在这里发布相关信息。

    Standard Attributes

    属性化字符串支持以下文本的标准属性。如果键不在字典中,则使用下面描述的默认值。

    NSString *NSFontAttributeName;
    NSString *NSParagraphStyleAttributeName;
    NSString *NSForegroundColorAttributeName;
    NSString *NSUnderlineStyleAttributeName;
    NSString *NSSuperscriptAttributeName;
    NSString *NSBackgroundColorAttributeName;
    NSString *NSAttachmentAttributeName;
    NSString *NSLigatureAttributeName;
    NSString *NSBaselineOffsetAttributeName;
    NSString *NSKernAttributeName;
    NSString *NSLinkAttributeName;
    NSString *NSStrokeWidthAttributeName;
    NSString *NSStrokeColorAttributeName;
    NSString *NSUnderlineColorAttributeName;
    NSString *NSStrikethroughStyleAttributeName;
    NSString *NSStrikethroughColorAttributeName;
    NSString *NSShadowAttributeName;
    NSString *NSObliquenessAttributeName;
    NSString *NSExpansionAttributeName;
    NSString *NSCursorAttributeName;
    NSString *NSToolTipAttributeName;
    NSString *NSMarkedClauseSegmentAttributeName;
    NSString *NSWritingDirectionAttributeName;
    NSString *NSVerticalGlyphFormAttributeName;
    NSString *NSTextAlternativesAttributeName;
    

    NSAttributedString programming guide

    完整的类引用是 here .

        4
  •  24
  •   Seema Sharma    8 年前

    这个解决方案适用于任何长度

    NSString *strFirst = @"Anylengthtext";
    NSString *strSecond = @"Anylengthtext";
    NSString *strThird = @"Anylengthtext";
    
    NSString *strComplete = [NSString stringWithFormat:@"%@ %@ %@",strFirst,strSecond,strThird];
    
    NSMutableAttributedString *attributedString =[[NSMutableAttributedString alloc] initWithString:strComplete];
    
    [attributedString addAttribute:NSForegroundColorAttributeName
                  value:[UIColor redColor]
                  range:[strComplete rangeOfString:strFirst]];
    
    [attributedString addAttribute:NSForegroundColorAttributeName
                  value:[UIColor yellowColor]
                  range:[strComplete rangeOfString:strSecond]];
    
    [attributedString addAttribute:NSForegroundColorAttributeName
                  value:[UIColor blueColor]
                  range:[strComplete rangeOfString:strThird]];
    
    
    self.lblName.attributedText = attributedString;
    
        5
  •  15
  •   Shmidt    11 年前

    我编写了帮助器来轻松添加属性:

    - (void)addColor:(UIColor *)color substring:(NSString *)substring;
    - (void)addBackgroundColor:(UIColor *)color substring:(NSString *)substring;
    - (void)addUnderlineForSubstring:(NSString *)substring;
    - (void)addStrikeThrough:(int)thickness substring:(NSString *)substring;
    - (void)addShadowColor:(UIColor *)color width:(int)width height:(int)height radius:(int)radius substring:(NSString *)substring;
    - (void)addFontWithName:(NSString *)fontName size:(int)fontSize substring:(NSString *)substring;
    - (void)addAlignment:(NSTextAlignment)alignment substring:(NSString *)substring;
    - (void)addColorToRussianText:(UIColor *)color;
    - (void)addStrokeColor:(UIColor *)color thickness:(int)thickness substring:(NSString *)substring;
    - (void)addVerticalGlyph:(BOOL)glyph substring:(NSString *)substring;
    

    https://github.com/shmidt/MASAttributes

    您也可以通过cocoapods安装: pod 'MASAttributes', '~> 1.0.0'

        6
  •  11
  •   André Rodrigues    10 年前

    从iOS 7开始,您可以使用 NSAttributedString 使用HTML语法:

    NSURL *htmlString = [[NSBundle mainBundle]  URLForResource: @"string"     withExtension:@"html"];
    NSAttributedString *stringWithHTMLAttributes = [[NSAttributedString alloc] initWithFileURL:htmlString
                                                                                           options:@{NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType}
                                                                                documentAttributes:nil
                                                                                             error:nil];
    textView.attributedText = stringWithHTMLAttributes;// you can use a label also
    

    您必须将文件“string.html”添加到项目中,HTML的内容可以如下所示:

    <html>
      <head>
        <style type="text/css">
          body {
            font-size: 15px;
            font-family: Avenir, Arial, sans-serif;
          }
          .red {
            color: red;
          }
          .green {
            color: green;
          }
          .blue {
            color: blue;
          }
        </style>
      </head>
      <body>
        <span class="red">first</span><span class="green">second</span><span class="blue">third</span>
      </body>
    </html>  
    

    现在,您可以使用 NSattributedString 如您所愿,即使没有HTML文件,例如:

    //At the top of your .m file
    #define RED_OCCURENCE -red_occurence-
    #define GREEN_OCCURENCE -green_occurence-
    #define BLUE_OCCURENCE -blue_occurence-
    #define HTML_TEMPLATE @"<span style=\"color:red\">-red_occurence-</span><span style=\"color:green\">-green_occurence-</span><span style=\"color:blue\">-blue_occurence-</span></body></html>"
    
    //Where you need to use your attributed string
    NSString *string = [HTML_TEMPLATE stringByReplacingOccurrencesOfString:RED_OCCURENCE withString:@"first"] ;
    string = [string stringByReplacingOccurrencesOfString:GREEN_OCCURENCE   withString:@"second"];
    string = [string stringByReplacingOccurrencesOfString:BLUE_OCCURENCE    withString:@"third"];
    
    NSData* cData = [string dataUsingEncoding:NSUTF8StringEncoding];
    
    NSAttributedString *stringWithHTMLAttributes = [[NSAttributedString alloc] initWithData:cData
                                                                                    options:@{NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType}
                                                                            documentAttributes:nil
                                                                                         error:nil];
    textView.attributedText = stringWithHTMLAttributes;
    

    Source

        7
  •  10
  •   Mark Bridges    11 年前

    我总是发现使用属性化字符串是一个令人难以置信的冗长乏味的过程。

    所以我做了一个Mac应用程序,为你创建所有代码。

    https://itunes.apple.com/us/app/attributed-string-creator/id730928349?mt=12

        8
  •  3
  •   Krunal    7 年前

    使用属性化字符串扩展的更简单的解决方案。

    扩展nsmutableAttributedString{ //此函数将颜色附加到字符串 func setcolorforText(texttofind:string,with color color:uicolor){ 让range:nsrange=self.mutableString.range(属于:texttofind,选项:.casensitive) self.addattribute(nsattributedStringKey.ForegroundColor,值:颜色,范围:范围) } } < /代码>

    试试看(在Swift 3&4中测试)

    let label=uilabel()。
    label.frame=cgrect(x:120,y:100,width:200,height:30)
    设为“第一”
    设秒为“秒”
    设第三个为“第三个”
    让string value=“\(first)\(second)\(third)”/或直接分配单个字符串值,如“first second third”
    
    let attributedString:nsmutableAttributedString=nsmutableAttributedString(String:StringValue)
    attributedString.setcolorforText(texttofind:first,withcolor:uicolor.red)//对字符串“first”使用变量
    attributedString.setcolorforText(texttofind:“second”,withcolor:uicolor.green)//或像这样的直接字符串“second”
    attributedString.setcolorforText(texttofind:third,withcolor:uicolor.blue)
    label.FONT=uiFONT.systemFONT(OFSIZE:26)
    label.attributedtext=属性字符串
    self.view.addSubview(标签)
    < /代码> 
    
    

    以下是预期结果:

    试试看(在Swift 3&4中测试)

    let label = UILabel()
    label.frame = CGRect(x: 120, y: 100, width: 200, height: 30)
    let first = "first"
    let second = "second"
    let third = "third"
    let stringValue = "\(first)\(second)\(third)"  // or direct assign single string value like "firstsecondthird"
    
    let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: stringValue)
    attributedString.setColorForText(textToFind: first, withColor: UIColor.red)   // use variable for string "first"
    attributedString.setColorForText(textToFind: "second", withColor: UIColor.green) // or direct string like this "second"
    attributedString.setColorForText(textToFind: third, withColor: UIColor.blue)
    label.font = UIFont.systemFont(ofSize: 26)
    label.attributedText = attributedString
    self.view.addSubview(label)
    

    预期结果如下:

    enter image description here

        9
  •  3
  •   Paul Roub Mark Dail    7 年前

    在SWIFT 4中:

    let string:NSMutableAttributedString = {
    
        let mutableString = NSMutableAttributedString(string: "firstsecondthird")
    
        mutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.red , range: NSRange(location: 0, length: 5))
        mutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.green , range: NSRange(location: 5, length: 6))
        mutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.blue , range: NSRange(location: 11, length: 5))
        return mutableString
    }()
    
    print(string)
    
        10
  •  2
  •   Bhavin Bhadani    9 年前

    你可以加载一个 HTML 属性化字符串 Swift 如下

       var Str = NSAttributedString(
       data: htmlstring.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true),
       options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
       documentAttributes: nil,
       error: nil)
    
       label.attributedText = Str  
    

    加载一个 html 从文件

       if let rtf = NSBundle.mainBundle().URLForResource("rtfdoc", withExtension: "rtf", subdirectory: nil, localization: nil) {
    
       let attributedString = NSAttributedString(fileURL: rtf, options: [NSDocumentTypeDocumentAttribute:NSRTFTextDocumentType], documentAttributes: nil, error: nil)
            textView.attributedText = attributedString
            textView.editable = false
        }
    

    http://sketchytech.blogspot.in/2013/11/creating-nsattributedstring-from-html.html

    并根据您所需的属性设置字符串….按照以下步骤操作..
    http://makeapppie.com/2014/10/20/swift-swift-using-attributed-strings-in-swift/

        11
  •  2
  •   Rishil Patel Rams    6 年前

    我做了一个图书馆,让这变得容易多了。退房 ZenCopy.

    您可以创建样式对象,和/或将其设置为以后要引用的键。这样地:

    ZenCopy.manager.config.setStyles {
        return [
            "token": Style(
                color: .blueColor(), // optional
                // fontName: "Helvetica", // optional
                fontSize: 14 // optional
            )
        ]
    }
    

    然后,您可以轻松地构造字符串并设置其样式并具有参数:)

    label.attributedText = attributedString(
                                    ["$0 ".style("token") "is dancing with ", "$1".style("token")], 
                              args: ["JP", "Brock"]
    )
    

    您还可以使用regex搜索轻松设置样式!

    let atUserRegex = "(@[A-Za-z0-9_]*)"
    mutableAttributedString.regexFind(atUserRegex, addStyle: "token")
    

    这将使用前面的“@”来设置所有单词的样式,并使用“token”样式。(例如,在jpmglone时)

    我还是要让一切正常 NSAttributedString 必须提供,但我认为 fontName , fontSize 颜色覆盖了大部分。期待大量更新:)

    如果你需要的话,我可以帮你开始。也在寻找反馈,所以如果它能让你的生活更容易,我会说任务完成了。

        12
  •  1
  •   zeisuke    9 年前
    - (void)changeColorWithString:(UILabel *)uilabel stringToReplace:(NSString *) stringToReplace uiColor:(UIColor *) uiColor{
        NSMutableAttributedString *text =
        [[NSMutableAttributedString alloc]
         initWithAttributedString: uilabel.attributedText];
    
        [text addAttribute: NSForegroundColorAttributeName value:uiColor range:[uilabel.text rangeOfString:stringToReplace]];
    
        [uilabel setAttributedText: text];
    
    }
    
        13
  •  0
  •   Pavel Sharanda    7 年前

    为了解决这类问题,我在斯威夫特创建了一个叫做Atributika的图书馆。

    let str = "<r>first</r><g>second</g><b>third</b>".style(tags:
            Style("r").foregroundColor(.red),
            Style("g").foregroundColor(.green),
            Style("b").foregroundColor(.blue)).attributedString
    
    label.attributedText = str
    

    你可以在这里找到它 https://github.com/psharanda/Atributika

        14
  •  0
  •   Shan Ye    6 年前

    斯威夫特4

    let combination = NSMutableAttributedString()
    
    var part1 = NSMutableAttributedString()
    var part2 = NSMutableAttributedString()
    var part3 = NSMutableAttributedString()
    
    let attrRegular = [NSAttributedStringKey.font : UIFont(name: "Palatino-Roman", size: 15)]
    
    let attrBold:Dictionary = [NSAttributedStringKey.font : UIFont(name: "Raleway-SemiBold", size: 15)]
    
    let attrBoldWithColor: Dictionary = [NSAttributedStringKey.font : UIFont(name: "Raleway-SemiBold", size: 15),
                                     NSAttributedStringKey.foregroundColor: UIColor.red]
    
    if let regular = attrRegular as? [NSAttributedStringKey : NSObject]{
        part1 = NSMutableAttributedString(string: "first", attributes: regular)
    
    }
    if let bold = attrRegular as? [NSAttributedStringKey : NSObject]{
        part2 = NSMutableAttributedString(string: "second", attributes: bold)
    }
    
    if let boldWithColor = attrBoldWithColor as? [NSAttributedStringKey : NSObject]{
        part3 = NSMutableAttributedString(string: "third", attributes: boldWithColor)
    }
    
    combination.append(part1)
    combination.append(part2)
    combination.append(part3)
    

    属性列表请参见此处 NSAttributedStringKey on Apple Docs

        15
  •  0
  •   Ashish Chauhan    6 年前

    非常简单的方法。

    let text = "This is a colorful attributed string"
    let attributedText = 
    NSMutableAttributedString.getAttributedString(fromString: text)
    attributedText.apply(color: .red, subString: "This")
    //Apply yellow color on range
    attributedText.apply(color: .yellow, onRange: NSMakeRange(5, 4))
    

    有关详细信息,请单击此处; https://github.com/iOSTechHub/AttributedString