Programer/iOS

[Swift] TextView 안에 있는 Hashtag 텍스트를 Link 하기

아즈샤 2016. 1. 8. 18:22
반응형

extension UITextView {

    func resolveHashTags(){

        let text:String = self.text

        let nsText:NSString = self.text

        let words:[NSString] = text.componentsSeparatedByStrings(["\n", " "])

        

        let attrs = [

            NSFontAttributeName : UIFont.systemFontOfSize(17.0)

        ]

 

        let attrString = NSMutableAttributedString(string: nsText as String, attributes:attrs)

 

        for word in words {

            if word.hasPrefix("#") {

                let hashTagWords:[NSString] = word.componentsSeparatedByString("#")

                

                for var hashTagWord in hashTagWords {

                    hashTagWord = "#" + (hashTagWord as String)

                    let matchRange:NSRange = nsText.rangeOfString(hashTagWord as String)

                    let stringifiedWord:String = hashTagWord as String

                    attrString.addAttribute(NSLinkAttributeName, value: "hash:\(stringifiedWord)", range: matchRange)

                }

            }

        }

        self.attributedText = attrString

    }

}

 

extension String {

    func componentsSeparatedByStrings(separators: [String]) -> [String] {

        return separators.reduce([self]) { result, separator in

            return result.flatMap { $0.componentsSeparatedByString(separator) }

            }

            .map { $0.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()) }

    }

}

 

Github에서 공개된 소스에서 #단어가 붙어 있을때 (EX: #해시테그1#해시테그2#해시테그3) 도 인식하도록 변형 시켰다.

 

사용 방법은 textView에 resolveHashTag() 해주면 된다.

 

- 참고사이트

https://gist.github.com/IanKeen/429bf37d6335b64e03da

https://github.com/ribl/SwiftTextViewHashtag

 

 


 

추가 : 진행하다 보니 해당 소스는 영문에서만 인식이 가능하다;;

한글은 인식을 못하는데 NSLinkAttributedName에 한글 인식이 안되는 것 같다.

 

방법을 찾아보다가 결국엔 stringifiedWord에 숫자로 파라미터 값을 보내고

배열에 해시 태그 들을 저장해 놓고 배열의 순서대로 stringifiedWord 값을 인덱스로 사용해서 구현을 하였다.

 

구현된 소스는 https://github.com/azsha/AZHashtagTextView 에 올려두었습니다~

 

 

반응형

 

반응형