4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

UITextViewの特定の文字をハイパーリンク化してみた。(Swift 3.0対応)

Posted at

This post is about how to make hyperlink of words in UITextView.

#Purpose
Personal Note

#Development Environment

  • OS X El Captain 10.11.2
  • Xcode Version 8.0

#Language
Swift 3.0

#Step
1- import UIKit to activate the library to use

import UIKit

2- Declare a parameter of firstRange

var firstRange: NSRange = NSRange()

3- Create main two functions (1. Decorate words / 2. Tap Action)

    func setHyperLink(targetText: String){
        let text = "Hello Qiita Hello Law Hello Guys"
        
        yourTextView.backgroundColor = UIColor.clear
        
        yourTextView.textAlignment = .left
        
        let nsTex = text as NSString
        let linkRange = text.range(of: targetText)
        
        let style = NSMutableParagraphStyle()
        style.alignment = NSTextAlignment.left
        
        let attributedString = NSMutableAttributedString(string: text, attributes: [ NSParagraphStyleAttributeName: style ])
        
        let firstStart = text.distance(from: text.startIndex, to: linkRange!.lowerBound)
        let firstLength = targetText.characters.count
        firstRange = NSMakeRange(firstStart, firstLength)
        let boldFontAttribute = [NSFontAttributeName: UIFont.boldSystemFont(ofSize: 13.0)]
        
        
        /*リンク位置範囲生成*/
        // all text colour
        attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.black, range: NSMakeRange(0, nsTex.length))
        // link colour
        attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.black, range: firstRange)
        attributedString.addAttributes(boldFontAttribute, range: firstRange)
        
        yourTextView.attributedText = attributedString
        
        let firstTap = UITapGestureRecognizer(target: self, action: #selector(self.tapText(tap:)))
        yourTextView.addGestureRecognizer(firstTap)

    }
    
    func tapText(tap: UITapGestureRecognizer) {
        let location = tap.location(in: yourTextView)
        let textPosition = yourTextView.closestPosition(to: location)
        let selectedPosition = yourTextView.offset(from: yourTextView.beginningOfDocument, to: textPosition!)
        if NSLocationInRange(selectedPosition, firstRange) {
            // Add your action. For Example, navigating to another page
            print("You tapped")
        }
    }
}

4- Done

#Source Code

ViewController.swift
import UIKit

class ViewController: UIViewController {
   
    @IBOutlet weak var yourTextView: UITextView!

    var firstRange: NSRange = NSRange()

    override func viewDidLoad() {
        super.viewDidLoad()
        yourTextView.isEditable = false
        setHyperLink(targetText: "Law")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

/* Function */
extension ViewController{
    // Hyper Link
    func setHyperLink(targetText: String){
        let text = "Hello Qiita Hello Law Hello Guys"
        
        yourTextView.backgroundColor = UIColor.clear
        
        yourTextView.textAlignment = .left
        
        let nsTex = text as NSString
        let linkRange = text.range(of: targetText)
        
        let style = NSMutableParagraphStyle()
        style.alignment = NSTextAlignment.left
        
        let attributedString = NSMutableAttributedString(string: text, attributes: [ NSParagraphStyleAttributeName: style ])
        
        let firstStart = text.distance(from: text.startIndex, to: linkRange!.lowerBound)
        let firstLength = targetText.characters.count
        firstRange = NSMakeRange(firstStart, firstLength)
        let boldFontAttribute = [NSFontAttributeName: UIFont.boldSystemFont(ofSize: 13.0)]
        
        
        /*リンク位置範囲生成*/
        // all text colour
        attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.black, range: NSMakeRange(0, nsTex.length))
        // link colour
        attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.black, range: firstRange)
        attributedString.addAttributes(boldFontAttribute, range: firstRange)
        
        yourTextView.attributedText = attributedString
        
        let firstTap = UITapGestureRecognizer(target: self, action: #selector(self.tapText(tap:)))
        yourTextView.addGestureRecognizer(firstTap)

    }
    
    func tapText(tap: UITapGestureRecognizer) {
        let location = tap.location(in: yourTextView)
        let textPosition = yourTextView.closestPosition(to: location)
        let selectedPosition = yourTextView.offset(from: yourTextView.beginningOfDocument, to: textPosition!)
        if NSLocationInRange(selectedPosition, firstRange) {
            // Add your action. For Example, navigating to another page
            print("You tapped")
        }
    }
}

#Conclusion
The code is quite simple and if you understand how to use Range, you can apply in another way.

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?