以特定的方式将string转换为NSAttributedString

所以我有一个string,看起来像这样: Swift , VisualBasic , Ruby

我想转换这个string是这样的: 在这里输入图像说明

基本上我想创build一个单词后面的背景,是的,我可以使用NSTokenField库获取此行为,但我的文本不是用户手动input其预结构化(从一个数组),我不希望NSTokeField的整个行为,我只是想要这样的外观和select(通过select我的意思是清除一个单词在退格键,整个单词不是一个字母)

以及我知道如何改变一个文本的颜色是这样的

  func getColoredText(text: String) -> NSMutableAttributedString { let string:NSMutableAttributedString = NSMutableAttributedString(string: text) let words:[String] = text.componentsSeparatedByString(" ") var w = "" for word in words { if (word.hasPrefix("{|") && word.hasSuffix("|}")) { let range:NSRange = (string.string as NSString).rangeOfString(word) string.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: range) w = word.stringByReplacingOccurrencesOfString("{|", withString: "") w = w.stringByReplacingOccurrencesOfString("|}", withString: "") string.replaceCharactersInRange(range, withString: w) } } return string } 

但我不知道如何实现我想要的东西,如果有人可以提供给我一些指导,那么它会对我很有帮助

如果我的问题不够明确,请让我知道我会增加一些细节

如果你想要圆angular的话,使用几个UILabel就容易多了。

如果这是可以接受的,你可以首先生成一个属性的string数组,如:

 func getAttributedStrings(text: String) -> [NSAttributedString] { let words:[String] = text.componentsSeparatedByString(" , ") let attributes = [NSForegroundColorAttributeName: UIColor.whiteColor(), NSBackgroundColorAttributeName: UIColor.blueColor()] let attribWords = words.map({ return NSAttributedString(string: " \($0) ", attributes: attributes) }) return attribWords } 

对于每个属性string,我们需要创buildUILabel 。 为此,我们可以创build一个传入NSAttributedString的函数并返回一个UILabel

 func createLabel(string:NSAttributedString) ->UILabel { let label = UILabel() label.backgroundColor = UIColor.blueColor() label.attributedText = string label.sizeToFit() label.layer.masksToBounds = true label.layer.cornerRadius = label.frame.height * 0.5 return label } 

现在我们将把我们的inputstring转换成标签:

 let attribWords = getAttributedStrings("Java , Swift , JavaScript , Objective-C , Ruby , Pearl , Lisp , Haskell , C++ , C") let labels = attribWords.map { string in return createLabel(string) } 

现在我们只需要在视图中显示它们:

 let buffer:CGFloat = 3.0 var xOffset:CGFloat = buffer var yOffset:CGFloat = buffer let view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 320.0, height: 400.0)) view.backgroundColor = UIColor.lightGrayColor() for label in labels { label.frame.origin.x = xOffset label.frame.origin.y = yOffset if label.frame.maxX > view.frame.maxX { xOffset = buffer yOffset += label.frame.height + buffer label.frame.origin.x = xOffset label.frame.origin.y = yOffset } view.addSubview(label) xOffset += label.frame.width + buffer } 

我们也可以在这一点上把我们的观点重新调整到标签的高度,说:

 if let labelHeight = labels.last?.frame.height { view.frame.height = yOffset + labelHeight + buffer } 

把这个代码扔在一个快速的操场上,结果是: 在这里输入图像说明

如果你不能使用标签,如果你想要一个可编辑的UITextView例如,我会放弃在圆angular,只是说:

 let attribWords = getAttributedStrings("Java , Swift , JavaScript , Objective-C , Ruby , Pearl , Lisp , Haskell , C++ , C") let attribString = NSMutableAttributedString() attribWords.forEach{ attribString.appendAttributedString(NSAttributedString(string: " ")) attribString.appendAttributedString($0) } textView.attributedText = attribString