web-dev-qa-db-ja.com

iOS 7でのUITextViewリンクの検出

Interface Builderで管理されるUITextViewがあります。データ検出として、「リンク」をチェックします。 iOS 6ではすべてが正常に機能し、リンクが強調表示されてクリック可能になります。 iOS 7では、すべてのリンクは単なるプレーンテキストのままです。編集可能および選択可能なチェックボックスはオフになっています。

懸念されるのは、UITextViewUIScrollView内にあるコンテナビューのサブビューであることです。

57
Tobias

IOS 7では、UITextViewが選択可能な場合にのみリンク検出が機能するようです。したがって、UITextViewを選択不可にすると、リンク検出が機能しなくなりました。

IOS 6でもこれをテストしました。iOS6では、UITextViewを選択できない場合でもリンク検出が正常に機能することを確認できます。

68
Tobias

今日、電話番号の検出に問題がありました。 UITextViewは、古い電話番号を保持し、テキストを別の値に設定した後にテキストを強調表示したままにするように見えました。

テキストを新しい文字列に設定する前にsetText:nilを設定すると、textviewがリセットされ、電話番号が通常どおり強調表示されることがわかりました。これがiOS 7.0のUITextViewの何らかのバグかどうか疑問に思っています

いずれにせよ、これは私にとってはうまくいきました。

32
Theo Bendixson

IOS7が最初に登場したとき、これは私を悩ませ、このスレッドで答えを見つけました(実際の値を設定する前にUITextViewのテキスト属性をnilに設定することはトリックを行いました)。その後、突然、問題(私にとっては、文字列全体がリンクとして強調表示されていた)が再び発生しました(iOSの更新によるものと思われます)。

最終的に私にとってのトリックは、テキスト属性の使用を停止し、attributedTextを設定することでした。これを行ったら、fonts/scrolling/selectable/editable/etcを設定する必要があります。プログラムで消えました。 IBでUITextViewを定義し、必要に応じて値を設定し(スクロール、編集、選択、リンクと電話番号の検出)、属性付きの文字列を作成して設定します。

myUITextView.attributedString = myAttributedString;

そして突然、すべてが期待どおりに機能しました。これが将来の誰かに役立つことを願っています。

27
Raconteur

同じ問題が発生し、UITextViewのスクロールを無効にすると、ユーザーがtextviewと対話した後にのみ動作するのではなく、ロード時にリンク検出がアクティブになります。 UITextViewも選択可能および編集不可でなければなりませんでした。

detailTextView.scrollEnabled = NO;
detailTextView.editable = NO;
detailTextView.selectable = YES;

IOS6では、選択可能またはスクロールを有効にする必要はありません。

確認するもう1つのことは、セルとセルのコンテンツビューでuserinteractionが有効になっていることです。そうでない場合、リンクはクリックできません。

18
svarrall

textviewセルのUItableViewのデータ検出プロパティを使用するには、[これらの行を追加する必要があります]をチェックします。

    txtvwMsgText.userInteractionEnabled = YES;
    txtvwMsgText.dataDetectorTypes = UIDataDetectorTypeLink;
    txtvwMsgText.scrollEnabled = NO;
    txtvwMsgText.editable = NO;
    txtvwMsgText.selectable = YES;
14
Harish Pathak

NSDataDetectorをチェックアウトする必要があります。

これを使用して、さまざまなデータ(リンク、電話番号など)を検索して処理できます。このサイトをご覧ください:

http://nshipster.com/nsdatadetector/

dataDetectorTypesUITextViewプロパティを使用して、コードで検出するものを設定することもできます。ストーリーボードの移行の問題にすぎないかもしれません。

textView.dataDetectorTypes = UIDataDetectorTypeLink;
8
Daniel

編集不可の場合にのみ、テキストビューがリンクを認識することに注意してください!

「リンク検出」でeditable UITextViewを作成する方法に関する素敵なチュートリアルがあります

リンク検出付きの編集可能なUITextView

私は今までそのソリューションで問題を経験していません。

トリックは、GestureRecognizerタッチを警告し、編集を有効/無効にすることです。

selectable / not selectableiOS7の問題にも同じことを適用できます

7
Alexander

いくつかのテストの後、解決策を見つけました。

リンクをアクティブにし、選択を有効にしない場合は、gestureRecognizersを編集する必要があります。

たとえば、3つのLongPressGestureRecognizerがあります。 1つはリンクのクリック(minimumPressDuration = 0.12)、2つ目は編集可能モードでのズーム(minimumPressDuration = 0.5)、3つ目は選択(minimumPressDuration = 0.8)です。このソリューションでは、選択用のLongPressGestureRecognizerと、編集モードでのズーム用の2つ目が削除されます。

NSArray *textViewGestureRecognizers = self.captionTextView.gestureRecognizers;
NSMutableArray *mutableArrayOfGestureRecognizers = [[NSMutableArray alloc] init];
for (UIGestureRecognizer *gestureRecognizer in textViewGestureRecognizers) {
    if (![gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]) {
        [mutableArrayOfGestureRecognizers addObject:gestureRecognizer];
    } else {
        UILongPressGestureRecognizer *longPressGestureRecognizer = (UILongPressGestureRecognizer *)gestureRecognizer;
        if (longPressGestureRecognizer.minimumPressDuration < 0.3) {
            [mutableArrayOfGestureRecognizers addObject:gestureRecognizer];
        }
    }
}
self.captionTextView.gestureRecognizers = mutableArrayOfGestureRecognizers;

IOS 9でテストしましたが、すべてのバージョン(iOS 7、8、9)で動作するはずです。私はそれが役立つことを願っています! :)

5
Kubík Kašpar

トリックを見つけました、これはiOS 7で動作します!

あなたはあなたのxibまたはプログラムで選択可能なUITextViewを設定する必要があります

self.yourTextView.selectable = YES;

そして、スクロールを無効にして、テキストを設定した後に再度有効にする必要があります。

self.yourTextView.scrollEnabled = NO;
[self.yourTextView setText:contentString];
self.yourTextView.scrollEnabled = YES;
4
Álvaro Murillo

そのため、UITextViewを使用して、有効、選択可能、スクロール不可、リンクの検出を維持することは、見た目ほど簡単ではありません。 iOS 8でこれに遭遇しました。そのため、私のソリューションはviewDidLoadでこのようなことを行い、textBoxの編集が完了したらeditableプロパティをNOに設定することでした(通常はdoneIsTappedのようなメソッドです)。ここでの秘Theは、textvalueへのtext値の設定が完了した後、editableプロパティをNOに設定することです。これにより、UITextviewのリンクが有効になります。

- (void)viewDidLoad 
{
    [super viewDidLoad];
    self.txtViewComment.editable = YES;
    self.txtViewComment.selectable = YES;
    self.txtViewComment.dataDetectorTypes = UIDataDetectorTypeLink;
    self.txtViewComment.scrollEnabled = NO;
}

そして

- (IBAction)doneIsTapped:(id)sender 
{
    self.txtViewComment.text = @"set text what ever you want";
    self.txtViewComment.editable = NO; 
}

これにより、textviewでリンクが有効になりました。また、この時点ではストーリーボードを使用せず(またはAppleこの問題が修正されるまで)、コードを使用して不要な混乱を避けることをお勧めします。

4
skypirate

色合いの色を他の色に変更すると、実際に機能します。ただし、選択可能な場合、色合いも同じ色になります。

2
Desmond

UITextViewsのスクロール機能を無効にすると、同様の設定でうまくいきました。

2
Tharagon

UITextViewのスクロールプロパティをNoにします。動作します... Self.textView.ScrollingEnable = NO;

1
Shaheen Rehman

この回避策は私のために働く:

textView.selectable = YES;
textView.delegate = self;

- (void) textViewDidChangeSelection:(UITextView *)textView;
{
    NSRange range = NSMakeRange(NSNotFound, 0.0);
    if ( range.length && !NSEqualRanges(range, textView.selectedRange) ) {
        textView.selectedRange = range;
    }
}
0
Andrey Soloviev

プログラムでUITextviewを追加する場合は、以下の行を追加するだけです。

        _textView.userInteractionEnabled = YES;
        _textView.dataDetectorTypes = UIDataDetectorTypeLink;
        _textView.scrollEnabled = NO;
        _textView.editable = NO;

これは私のために働いた。

0

このスレッドは古いですが、Swiftでうまくいく答えが見つからなかったので、Swift 2.2

textView.dataDetectorTypes = UIDataDetectorTypes.Link
textView.selectable = true
0
Silvi

上記のどれも私にとってはうまくいきませんでしたが、代わりにこれを行いました:

[self.textView setDataDetectorTypes:UIDataDetectorTypeNone];
[self.textView.setTextColor:[UIColor whiteColor]];
[self.textView setDataDetectorTypes:UIDataDetectorTypeNone];

私はすべてのタイプを検出するはずのテキストビューでこれを行いましたが、検出されていない色は白に設定されていました。コードを変更して、検出する適切な色とリンクの種類を表すことができます。

0
Tunde