👋
[SwiftUI]AttributedStringのアクション(Safariで開く)を別のアクションにURL Schemeで置き換える
やりたいこと
テキスト内にあるURL
、メンション(@user)
、ハッシュタグ(#swift)
をタップした際に、それぞれアクションを設定したい
UIKitではActiveLabelがあるので、そちらが便利です。
SwiftUIで使おうとしましたが、描画がなぜか崩れてしまい解決方法が分からなかった為、諦めました。
AttributedStringのアクション
各要素に装飾(色、フォント、サイズ)を付けてURLを付けれるのがAttributedString
なのですが、そのURLは全てSafariで開かれてしまいカスタムアクションは指定できません。
解決方法(URL Schemeでアクションを設定する)
AttributedStringでURLは開けるので、アプリ側のURL Schemeを設定して事前に設定しておいたURLが返ってきたら、そのURL Schemeごとにアクションを割り当てるという手法で解決していきたいと思います。
例) testApp-hashtag://
testApp-mention://
これでもいいtestApp://?mode=hashtag
, testApp://?mode=mention
実装の概要
正規表現でURL, Hashtag, Mentionなどを探して見つけた文字列の範囲に文字色とlink(URL)を設定して、SwiftUI.Textで表示
onOpenURL
でURLでアプリが開かれた時のアクションを検知して、URLごと(testApp-hashtag://
testApp-mention://
)にアクションを判断して実行する
実装してみた
AttributedTextという名前でSPMとして作ってみました。
もっと良い方法
Text内の要素をタップするしてアクションを起こすためだけにURL Schemeを設定するのは、微妙な気しかしないので、もっといい方法があれば教えて欲しいです!
Discussion