¿Cómo se usa NSAttributedString?

Múltiples colores en un NSString o NSMutableStrings no son posibles. Así que he escuchado un poco sobre NSAttributedString que se introdujo con el iPad SDK 3.2 (o alrededor de 3.2) y está disponible en el iPhone a partir del iPhone SDK 4.0 beta .

Me gustaría tener una cuerda que tenga tres colores.

La razón por la que no uso 3 NSStrings separadas es porque la longitud de cada una de las tres subcadenas NSAttributedString cambia a menudo y, por lo tanto, preferiría no utilizar ningún cálculo para reubicar 3 objetos NSString separados.

Si es posible usar NSAttributedString ¿cómo hago lo siguiente? (Si no es posible con la cadena NSAttributed cómo lo haría):

texto alternativo

Editar: Recuerde, @"first" , @"second" y @"third" serán reemplazados por otras cadenas en cualquier momento. Por lo tanto, usar valores de NSRange codificados no funcionará.

Al construir cadenas atribuidas, prefiero usar la subclase mutable, solo para mantener las cosas más limpias.

Dicho esto, así es como se crea una cadena atribuida tricolor:

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

escrito en un navegador. Implementador de advertencias

Obviamente, no vas a codificar en los rangos como este. Quizás, en cambio, podrías hacer algo como:

 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 

La pregunta ya está respondida … pero quería mostrar cómo agregar sombra y cambiar también la fuente con NSAttributedString, de modo que cuando las personas busquen este tema no tengan que seguir buscando.

 #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 }]; 

Aquí hay una versión de Swift …

¡Advertencia! Esto funciona para 4s.

Durante 5 segundos, debe cambiar todos los valores Float a valores Double (porque el comstackdor aún no funciona correctamente)

Swift enum para la elección de fuente:

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

Swift array para acceso enum (necesario porque enum no puede usar ‘-‘):

 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 atribuye la función de texto:

 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 } 

primera y última extensión utilizada para encontrar rangos en una matriz de cadenas:

 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] } } } 

nuevos colores:

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

mi macro reemplazo:

 enum MyConstants: Float { case CornerRadius = 5.0 } 

mi creador de botones con texto atribuido:

 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 } 

mi creador de UIView / UILabel con texto atribuido, sombras y esquinas redondas:

 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 } 

añadir sombra genérica:

 func viewshadow (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 } 

Ver extensión para ver el estilo:

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

la vista real sí cargó la función:

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

Creo que es una forma muy conveniente de usar regular expressions para encontrar un rango para aplicar atributos. Así es como lo hice:

 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]; 

Estaba buscando una lista de atributos disponibles y no los encontré aquí y en la primera página de una referencia de clase. Así que decidí publicar aquí información sobre eso.

Atributos estándar

Las cadenas atribuidas admiten los siguientes atributos estándar para el texto. Si la clave no está en el diccionario, utilice los valores predeterminados que se describen a continuación.

 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; 

Guía de progtwigción NSAttributedString

Una referencia de clase completa está aquí .

Esta solución funcionará para cualquier longitud

 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; 

Escribí ayuda para agregar atributos fácilmente:

 - (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

También puede instalar a través de CocoaPods: pod 'MASAttributes', '~> 1.0.0'

Desde iOS 7 puedes usar NSAttributedString con syntax 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 

Tienes que agregar el archivo “string.html” al proyecto, y el contenido del html puede ser así:

      firstsecondthird   

Ahora puedes usar NSAttributedString como quieras, incluso sin un archivo HTML, como por ejemplo:

 //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 @"-red_occurence--green_occurence--blue_occurence-" //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; 

Fuente

Siempre he encontrado que trabajar con cadenas atribuidas es un proceso increíblemente largo y tedioso.

Así que hice una aplicación Mac que crea todo el código para ti.

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

Una solución más fácil con extensión de cadena atribuida.

 extension NSMutableAttributedString { // this function attaches color to string func setColorForText(textToFind: String, withColor color: UIColor) { let range: NSRange = self.mutableString.range(of: textToFind, options: .caseInsensitive) self.addAttribute(NSAttributedStringKey.foregroundColor, value: color, range: range) } } 

Prueba esto y mira (Probado en Swift 3 y 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) 

Aquí está el resultado esperado:

enter image description here

En 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) 

Puede cargar una cadena atribuida HTML en Swift siguiente manera

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

Para cargar un html desde el archivo

  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

Y configure la secuencia según su atributo requerido … siga esto ..
http://makeapppie.com/2014/10/20/swift-swift-using-attributed-strings-in-swift/

Hice una biblioteca que hace esto mucho más fácil. Echa un vistazo a ZenCopy.

Puede crear objetos de Estilo y / o establecerlos en claves para referencia posterior. Me gusta esto:

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

Entonces, puedes construir fácilmente cadenas Y darles un estilo Y tener parámetros 🙂

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

¡También puede diseñar cosas fácilmente con búsquedas de expresiones regulares!

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

Esto estilizará todas las palabras con ‘@’ al frente con el estilo ‘token’. (por ejemplo, @jpmcglone)

Necesito seguir trabajando con todo lo que NSAttributedString tiene para ofrecer, pero creo que fontName , fontSize y color cubren la mayor parte. Espere muchas actualizaciones pronto 🙂

Puedo ayudarte a comenzar con esto si lo necesitas. También estoy en busca de comentarios, por lo que si te hace la vida más fácil, diría misión cumplida.

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

Para resolver ese tipo de problemas, creé una biblioteca a la velocidad que se llama Atributika.

 let str = "firstsecondthird".style(tags: Style("r").foregroundColor(.red), Style("g").foregroundColor(.green), Style("b").foregroundColor(.blue)).attributedString label.attributedText = str 

Puede encontrarlo aquí https://github.com/psharanda/Atributika

Swift 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) 

Lista de atributos, consulte aquí NSAttributedStringKey en Apple Docs

Manera súper fácil de hacer esto.

 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)) 

Para más detalles haga clic aquí; https://github.com/iOSTechHub/AttributedString