我知道UITextView
默认可以检测到URL,但是我怎样才能检测到#tatata(#)?
它不需要在键入时检测主题标签,但随后viewDidLoad
文本设置在UITextView
,所以我想检测主题标签作为颜色或什么.
我一直在使用ActiveLabel,但这只是用于UILabel
,我需要具有的滚动功能UITextView
.
使用任何名称创建一个新的swift文件(UITextViewHashtagExtension.swift
)
在下面插入以下代码:
import UIKit extension UITextView { func resolveHashTags(){ // turn string in to NSString let nsText:NSString = self.text // this needs to be an array of NSString. String does not work. let words:[NSString] = nsText.componentsSeparatedByString(" ") // you can't set the font size in the storyboard anymore, since it gets overridden here. let attrs = [ NSFontAttributeName : UIFont.systemFontOfSize(17.0) ] // you can staple URLs onto attributed strings let attrString = NSMutableAttributedString(string: nsText as String, attributes:attrs) // tag each word if it has a hashtag for word in words { // found a word that is prepended by a hashtag! // homework for you: implement @mentions here too. if word.hasPrefix("#") { // a range is the character position, followed by how many characters are in the word. // we need this because we staple the "href" to this range. let matchRange:NSRange = nsText.rangeOfString(word as String) // convert the word from NSString to String // this allows us to call "dropFirst" to remove the hashtag var stringifiedWord:String = word as String // drop the hashtag stringifiedWord = String(stringifiedWord.characters.dropFirst()) // check to see if the hashtag has numbers. // ribl is "#1" shouldn't be considered a hashtag. let digits = NSCharacterSet.decimalDigitCharacterSet() if let numbersExist = stringifiedWord.rangeOfCharacterFromSet(digits) { // hashtag contains a number, like "#1" // so don't make it clickable } else { // set a link for when the user clicks on this word. // it's not enough to use the word "hash", but you need the url scheme syntax "hash://" // note: since it's a URL now, the color is set to the project's tint color attrString.addAttribute(NSLinkAttributeName, value: "hash:\(stringifiedWord)", range: matchRange) } } } // we're used to textView.text // but here we use textView.attributedText // again, this will also wipe out any fonts and colors from the storyboard, // so remember to re-add them in the attrs dictionary above self.attributedText = attrString } }
要使用它,您可以执行以下操作:
self.textView.text = "This is an #example test" self.textView.resolveHashTags()
针对Swift 4.0进行了更新:
extension UITextView { func resolveHashTags() { // turn string in to NSString let nsText = NSString(string: self.text) // this needs to be an array of NSString. String does not work. let words = nsText.components(separatedBy: CharacterSet(charactersIn: "#ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_").inverted) // you can staple URLs onto attributed strings let attrString = NSMutableAttributedString() attrString.setAttributedString(self.attributedText) // tag each word if it has a hashtag for word in words { if word.count < 3 { continue } // found a word that is prepended by a hashtag! // homework for you: implement @mentions here too. if word.hasPrefix("#") { // a range is the character position, followed by how many characters are in the word. // we need this because we staple the "href" to this range. let matchRange:NSRange = nsText.range(of: word as String) // drop the hashtag let stringifiedWord = word.dropFirst() if let firstChar = stringifiedWord.unicodeScalars.first, NSCharacterSet.decimalDigits.contains(firstChar) { // hashtag contains a number, like "#1" // so don't make it clickable } else { // set a link for when the user clicks on this word. // it's not enough to use the word "hash", but you need the url scheme syntax "hash://" // note: since it's a URL now, the color is set to the project's tint color attrString.addAttribute(NSAttributedStringKey.link, value: "hash:\(stringifiedWord)", range: matchRange) } } } // we're used to textView.text // but here we use textView.attributedText // again, this will also wipe out any fonts and colors from the storyboard, // so remember to re-add them in the attrs dictionary above self.attributedText = attrString } }
一种选择是使用这样的NSAttributedString
东西......
func convertHashtags(text:String) -> NSAttributedString { let attrString = NSMutableAttributedString(string: text) attrString.beginEditing() // match all hashtags do { // Find all the hashtags in our string let regex = try NSRegularExpression(pattern: "(?:\\s|^)(#(?:[a-zA-Z].*?|\\d+[a-zA-Z]+.*?))\\b", options: NSRegularExpressionOptions.AnchorsMatchLines) let results = regex.matchesInString(text, options: NSMatchingOptions.WithoutAnchoringBounds, range: NSMakeRange(0, text.characters.count)) let array = results.map { (text as NSString).substringWithRange($0.range) } for hashtag in array { // get range of the hashtag in the main string let range = (attrString.string as NSString).rangeOfString(hashtag) // add a colour to the hashtag attrString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor() , range: range) } attrString.endEditing() } catch { attrString.endEditing() } return attrString }
然后分配你attributedText
喜欢这个......
let myText = "some text with a #hashtag in side of it #itsnoteasy" self.textView.attributedText = convertHashtags(myText)