2016年9月13日火曜日

TextView内のURLリンクを有効にする

TextViewの中にURLとかが書かれてた場合、それをタップしてSafariとかで表示する方法。


  1. TextViewでURLを検知するチェックをオンにする。(Storyboardもしくはコードで)
  2. TextViewを編集不可能にしておく。(Storyboardもしくはコードで)
  3. TextViewのタップジェスチャーを追加し、タップされたら編集可能にし、キーボードを表示するように設定。
  4. Delegateで編集終了を検知し、編集不可能にし、キーボードを隠す。
  5. URLを押すとSafariでリンクが開き(YouTube動画の場合はYouTubeアプリが)、URL以外を押すと編集が可能になる。


あらかじめdelegateを設定
@interface DetailTableViewController : UITableViewController <UITextViewDelegate>

viewDidLoadあたりで
_detailTextView.delegate = self;
//TextViewのLinkを有効にする
//StoryboardのDetectionのLinksをオンにしてもいい
_detailTextView.dataDetectorTypes = UIDataDetectorTypeLink;
//TextViewにタップジェスチャー追加
//通常は編集不可でリンクを有効にし、タップしたら編集可能にするため
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(textViewTap)];

[_detailTextView addGestureRecognizer:tap];


//textViewがタップされたらエディタブルにしてキーボード表示
-(void)textViewTap {
    [_detailTextView setEditable:YES]; //編集可能に
    [_detailTextView becomeFirstResponder]; //キーボード表示
}


//textView編集終了時、キーボードを隠し、元データを更新
- (BOOL)textViewShouldEndEditing:(UITextView *)textView
{
    [textView setEditable:NO]; //編集不可に(linkを有効にするため)
    [textView endEditing:YES]; //キーボード隠す
    
    return YES;
}


編集不可能な状態じゃないと、Linkを有効に設定していても有効にならない。しかし編集可能になってくれないとTextViewの意味がない。
というわけで、タップジェスチャーとDelegateを使って編集可能、不可能の設定をON/OFFしてやるわけですな。めんどくせぇ。
これくらいOSサイドで一括処理してくんないかしらね?

URLの他にも住所、イベント(日付かな?)、電話番号の認識もあるようだ。いろいろやってみるよろし。

0 件のコメント:

コメントを投稿