何が問題か
iOS13からテキストのリンクなどに用いられるUITextViewDelegateのtextViewメソッドが
iOS12まではTouchUp
で反応していたもののiOS13からなぜかTouchDown
で反応してしまうという問題がありました.
参考記事
どう解決するか
- iOS13の不具合(?)の修正を待つ
- textViewメソッドのtextViewインスタンスからタッチイベントを取得する
- そもそもtextViewDelegateメソッドを使用しない
以上の3つがあると思います.
iOS13の不具合修正を待つ
いつAppleが修正を行うのかは不明瞭で今の所この修正はベータ版にも含まれていないようなので,これは懸命な解決法ではなさそうです.
textViewメソッドのtextView
インスタンスからタッチイベントを取得する
以下のtextViewメソッドから受け取れるtextViewのタッチイベントを取得する方法です.
func textView(_ textView: UITextView,
shouldInteractWith URL: URL,
in characterRange: NSRange,
interaction: UITextItemInteraction) -> Bool
以下のようにまずinteraction
で処理をわけ,textView
のタップイベント処理が終わった時に何かの処理をさせることで擬似的にTouchUp
の挙動と同じになるようにしています.出典はstackOverflowです.
func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
switch interaction {
case .invokeDefaultAction:
if textView.gestureRecognizers?.contains(where: {$0.isKind(of: UITapGestureRecognizer.self) && $0.state == .ended}) == true {
// Handle your custom logic here.
return false
}
return true
case .presentActions:
// Default action.
return true
case .preview:
// Default action.
return true
@unknown default:
fatalError()
}
}
そもそもUITextViewDelegateを使用しない
そもそもiOS13側の不具合である可能性が高く,いつ対応がされるのかがわからないため上記のtextView
のタッチイベントを拾ってtouchUp
のように振る舞わさせるのは少し冗長な気もします.
iOS13からURLなどを長押しした際のOS側の挙動が変わっている(以前までのアクションシートが起動するだけのものから変更されてプレビューが表示されるなどOS準拠の挙動がリッチになってきている)こともあり,あえて自分でそのさきを処理せず,OS準拠の挙動に合わせるということもありなのではないかなと思います.
参考資料