30
20

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.

SwiftでUITextViewにリンクを挿入する

Last updated at Posted at 2017-11-03

はじめに

以下のような、複数のタップ可能なリンクを持つUITextViewの作成方法のメモです。
リンクタップした際に、ログ送信など別の処理も行いたいものと想定します。

image.png

実現方法

UITextViewへリンクを追加する方法はNSMutableAttributedString(.link)を追加することで実現できます。また、リンクタップ時の処理は、何かリンクを識別する文字列をURLとして与えておき、UItextViewのデリゲートメソッド内で判別してハンドリングします。

UITextViewがリンクをタップされた際に実行されるデリゲートメソッド
public func textView(_ textView: UITextView, 
                     shouldInteractWith URL: URL, 
                     in characterRange: NSRange, 
                     interaction: UITextItemInteraction) -> Bool { }

以下のソースコードでは、利用規約およびプライバシーポリシーのリンクを識別する文字列として、TermOfUseLinkPrivacyPolicyLinkを設定しています。
※識別する文字列にマルチバイト文字を設定するとクラッシュするので注意

利用規約およびプライバシーポリシーのリンクを識別する文字列の設定
        attributedString.addAttribute(.link,
                                      value: "TermOfUseLink",
                                      range: NSString(string: baseString).range(of: "利用規約"))
        
        attributedString.addAttribute(.link,
                                      value: "PrivacyPolicyLink",
                                      range: NSString(string: baseString).range(of: "プライバシーポリシー"))

ソースコード

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let baseString = "利用規約、プライバシーポリシーに同意する。"
        let attributedString = NSMutableAttributedString(string: baseString)
        
        attributedString.addAttribute(.link,
                                      value: "TermOfUseLink",
                                      range: NSString(string: baseString).range(of: "利用規約"))
        
        attributedString.addAttribute(.link,
                                      value: "PrivacyPolicyLink",
                                      range: NSString(string: baseString).range(of: "プライバシーポリシー"))
        
        let textView = UITextView()
        textView.attributedText = attributedString
        textView.frame = CGRect(x: 0, y: 0, width: 300, height: 300)
        textView.center = view.center
        textView.isSelectable = true
        textView.isEditable = false
        textView.delegate = self
        view.addSubview(textView)
    }
}

extension UIViewController: UITextViewDelegate {
    public func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
        
        let urlString = URL.absoluteString
        if urlString == "TermOfUseLink" {
            print("利用規約のリンクがタップされました")
            // ログ送信処理
            // 利用規約画面を開く処理
        }
        
        if urlString == "PrivacyPolicyLink" {
            print("プライバシーポリシーのリンクがタップされました")
            // ログ送信処理
            // プライバシーポリシー画面を開く処理
        }
        
        return false
    }
}

参考

30
20
1

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
30
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?