メニュー
解決済
回答
1
swift Swift ios iOS UITextViewをタップしたときのイベントを拾いたい

2016年10月7日 11:05

UITextViewは標準でタップしたらソフトウェアキーボードを表示して文字入力するようになっていますが、それを止めて独自のイベント処理を実行したいと思っています。
どのように実装すればよいでしょうか。ご確認よろしくお願いします。

    高橋 良輔 4年 ago  

    UITextViewのタッチイベントを取得するためにはUITextViewを継承した独自クラスを作成してタッチイベント関連のメソッドをオーバーライドする必要があります。
    下記のようにToucheEventTextViewというようなUITextViewを継承したクラスを実装します。

    ToucheEventTextView.swift

    class ToucheEventTextView: UITextView {
    
        override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
            if let next = next {
                next.touchesBegan(touches , with: event)
            } else {
                super.touchesBegan(touches , with: event)
            }
        }
    
        override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
            if let next = next {
                next.touchesEnded(touches , with: event)
            } else {
                super.touchesEnded(touches , with: event)
            }
        }
    
        override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
            if let next = next {
                next.touchesCancelled(touches, with: event)
            } else {
                super.touchesCancelled(touches, with: event)
            }
        }
    
        override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
            if let next = next {
                next.touchesMoved(touches, with: event)
            } else {
                super.touchesMoved(touches, with: event)
            }
        }
    }
    

    タッチ認識したいViewControllerにTextViewを配置します。

    identity inspectorを選択して先程作成したToucheEventTextViewを指定します。

    下図のようにIBoutletで関連付けするとオブジェクト型がUITextViewからToucheEventTextViewになります。

    ViewControllerにタッチ検知のコードを追加します。タッチを検知するタイミングとしてtouchesEndedにしていますがtouchesBeganなどお好みのデリゲートメソッドをオーバーライドしてください。
    また、TextViewでソフトウェアキーボードが出ないように、またTextView内のテキストを選択しないようにtextView.isSelectable = falsetextView.isEditable = falseを追加してください。
    タッチしたViewがTextViewかどうかの判別は該当ビューにtextView.tag = 123tagを追加して判別しています。

    import UIKit
    
    class ViewController: UIViewController {
    
        @IBOutlet weak var textView: ToucheEventTextView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            textView.isEditable = false
            textView.isSelectable = false
            textView.tag = 123
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    
        override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
            print("touchesEnded")
            if isTouch(touches: touches, view: textView) {
                print("TextView touch!!")
            }
        }
    
        func isTouch(touches: Set<UITouch>, view:UIView) -> Bool{
            for touch: AnyObject in touches {
                let t: UITouch = touch as! UITouch
                if t.view?.tag == view.tag {
                    return true
                } else {
                    return false
                }
            }
            return false
        }
    
    }
    

    これでビルドしてみましょう。TextView部分をタップして下記のようにログが出力されるはずです。

コメントを追加するためには 会員登録・ログインが必要です。

太字斜体H3H4リンク画像引用コード番号リストリスト

投稿者プロフィール
新しもの好きエンジニア。