質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

1015閲覧

LINEのようにTextView上のURLをタップすると、アプリ内ブラウザを開きたい

Y_M

総合スコア265

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/08/25 10:17

編集2017/08/28 02:23

###前提・実現したいこと
TextViewでURLをタップできるようには出来たのですが、
このまま普通にタップを行うと、Safariが開いてしまうと思います。

これをアプリ内でUIWebViewWKWebViewを生成し開くようにしたいのですが知識が足りず実装が出来ない状況です。

Swiftでこちらを実装する方法を教えていただけないでしょうか。

###試したこと
こちらのサイトを見てみたのですが、
Objective-Cで書かれていることもあり理解できずにいます。

またより良い方法等あれば教えてください。

###補足情報(言語/FW/ツール等のバージョンなど)
Xcode8
Swift3

###コード

Swift

1class ViewController: UIViewController, UITextViewDelegate { 2 3 @IBOutlet weak var textView: UITextView! 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 8 textView.delegate = self 9 textView.layer.borderWidth = 1.0 10 } 11 12 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 13 let touch = touches.first 14 let touchPoint = touch?.location(in: self.view) 15 let touchPoint2 = self.textView.convert(touchPoint!, from: self.view) 16 print(touchPoint2) 17 } 18 19}

###追記
UITextViewで意図的にリンクを張ったものに対する処理ではなく、
Data DetectorsLinkをオンにした際、
サーバーから取得した文字列にURLがあった場合に自動でリンク化されたものを乗っ取り、
アプリ内WebViewで表示したいつもりです。

やはり自動リンクではなく、手動でリンクを付けたものしか開くように出来ないのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

少し難しく考えすぎていたようでした。

ひとまずこちらのメソッドを使うことで想定していた動作になりました。
textView(_:shouldInteractWith:in:interaction:)

投稿2017/08/28 02:38

Y_M

総合スコア265

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

タップした座標から、そこに書かれている文字に設定された属性を取得することができます。
UITapGestureRecognizerを利用するか、またはtouchesBegan(),touchesEnded()をオーバーライドして、UITextView上のタップ座標が取得できたら、以下のコードでURLが取得できます。URLが設定されていなければnilが返ります。

swift

1func tappedURL(textView: UITextView, location: CGPoint) -> URL? { 2 guard let textPoint = textView.closestPosition(to: location) else { return nil } 3 let styles = textView.textStyling(at: textPoint, in: .forward) 4 return styles?[NSLinkAttributeName] as? URL 5}

投稿2017/08/26 20:47

Stripe

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y_M

2017/08/28 01:25

とりあえずtouchBegan()をオーバーライドしましたが、textView上での座標が取れません。 コードを追記しますのでご指摘お願い致します。
fuzzball

2017/08/28 01:34 編集

UIViewのconvert(_:to:)だかconvert(_:from:)で変換できます。
Y_M

2017/08/28 01:51

実装したものを更新しました。 言葉が悪かったですが、textView上をタップするとprintされず、 textViewのコンポーネントサイズ外(self.view)をタップするとtextView上での座標が表示されるようになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問