Как вы используете NSAttributedString?
несколько цветов в элементе NSString
или NSMutableStrings
не возможно. Так что я немного слышал о NSAttributedString
который был введен с iPad SDK 3.2 (или около 3.2) и доступен на iPhone с iPhone SDK 4.0 beta.
Я хотел бы получить строку, которая имеет три цвета.
причина, по которой я не использую 3 отдельных NSStrings, заключается в том, что длина каждого из трех NSAttributedString
подстроки часто меняются и поэтому я бы предпочел, чтобы не использовать какие-либо вычисления для повторного позиционирования 3 отдельных NSString
объекты.
если это возможно с помощью NSAttributedString
Как сделать следующее - (если это невозможно с помощью строки NSAttributed, как бы вы это сделали):
Edit:
Помни,@"first"
,@"second"
и @"third"
будут заменены другими строками в любое время. Поэтому использование жестко закодированных значений NSRange не будет работать.
15 ответов:
при построении атрибутивных строк я предпочитаю использовать изменяемый подкласс, просто чтобы все было чище.
как говорится, вот как вы создаете трехцветную строку с атрибутом:
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
на этот вопрос уже дан ответ... но я хотел показать, как добавить тень и изменить шрифт с помощью 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 вы должны изменить все значения Float на двойные значения (потому что компилятор еще не работает правильно)
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 }
my button maker w / attributed text:
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 w / приписанный текст, тень, и круглые углы:
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) }
Я думаю, это очень удобный способ использовать
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];
Я искал список доступных атрибутов и не нашел их здесь и на первой странице ссылки на класс. Поэтому я решил разместить здесь информацию об этом.
отнести строки поддерживают следующие стандартные атрибуты для текста. Если ключа нет в словаре, затем используйте значения по умолчанию, описанные ниже.
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
полная ссылка на класс здесь.
Это решение будет работать для любой длины
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;
Я написал помощник, чтобы добавить атрибуты легко:
- (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'
начиная с 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
вы должны добавить файл "строку.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;
Я всегда считал работу с приписанными строками невероятно долгим и утомительным процессом.
поэтому я сделал приложение Mac, которое создает весь код для вас.
https://itunes.apple.com/us/app/attributed-string-creator/id730928349?mt=12
более простое решение с атрибутивным расширением строки.
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) } }
попробуйте это и посмотрите (протестировано в 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)
вот ожидаемый результат:
В 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)
вы можете загрузить
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
и строке настройки в соответствии с вашим обязательным атрибутом....следуй this..
http://makeapppie.com/2014/10/20/swift-swift-using-attributed-strings-in-swift/
Я сделал библиотеку, которая делает это намного проще. Проверьте ZenCopy.
вы можете создавать объекты типа, и/или установить ключи для ссылки позже. Вот так:
ZenCopy.manager.config.setStyles { return [ "token": Style( color: .blueColor(), // optional // fontName: "Helvetica", // optional fontSize: 14 // optional ) ] }
тогда вы можете легко построить строки и стиль их и иметь параметры :)
label.attributedText = attributedString( [" ".style("token") "is dancing with ", "".style("token")], args: ["JP", "Brock"] )
вы также можете легко стилизовать вещи с помощью регулярных выражений!
let atUserRegex = "(@[A-Za-z0-9_]*)" mutableAttributedString.regexFind(atUserRegex, addStyle: "token")
это будет стиль все слова С " @ "перед ним с "токен" стиль. (например, @jpmcglone)
мне нужно еще заставить его работать W/ все
NSAttributedString
предложить, но я думаюfontName
,fontSize
и цвет покрывает большую часть его. Ожидайте много обновлений в ближайшее время:)Я могу помочь вам начать с этого, если вам нужно. Также ищу обратную связь, поэтому, если это облегчает вашу жизнь, я бы сказал, что миссия выполнена.
- (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]; }
для решения такого рода задач я создал библиотеку в swift, которая называется атрибутика.
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
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)
список атрибутов смотрите здесьNSAttributedStringKey на Apple Docs
супер простой способ сделать это.
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