3D Touch対応端末だとリンクを強く長押しした際にshouldInteractWithURLが2度呼ばれるためハマッた。対処法が若干黒魔法的な手法にはなってしまうが。。
用途
UITextViewのDataDetectorsで指定したリンカブルな文字列を長押しした場合にSafariに飛ばさず自前で実装する場合
対応方法
UITextViewに含まれるgestureRecognizersからUIGestureRecognizerを取り出し、特定のゼスチャーを無効にする。アプリ全体で使用するならカテゴリ化すると良い。
3D Touch対応端末かどうかの判定を処理実行前に分岐させるのが望ましい。
UITextView+Extension.m
for (UIGestureRecognizer *gesture in self.gestureRecognizers) {
NSString *gestureClassName = NSStringFromClass([gesture class]);
if ([gestureClassName isEqualToString:@"_UIRevealGestureRecognizer"]) {
gesture.enabled = NO;
}
}
備考
リンクを長押しした時のハイライト表示の挙動をいじりたい場合は同じくgestureRecognizersに含まれるゼスチャーを取り出してenabledの値を指定すると解決する模様。