Interface Builderで管理されるUITextView
があります。データ検出として、「リンク」をチェックします。 iOS 6ではすべてが正常に機能し、リンクが強調表示されてクリック可能になります。 iOS 7では、すべてのリンクは単なるプレーンテキストのままです。編集可能および選択可能なチェックボックスはオフになっています。
懸念されるのは、UITextView
がUIScrollView
内にあるコンテナビューのサブビューであることです。
IOS 7では、UITextView
が選択可能な場合にのみリンク検出が機能するようです。したがって、UITextView
を選択不可にすると、リンク検出が機能しなくなりました。
IOS 6でもこれをテストしました。iOS6では、UITextView
を選択できない場合でもリンク検出が正常に機能することを確認できます。
今日、電話番号の検出に問題がありました。 UITextViewは、古い電話番号を保持し、テキストを別の値に設定した後にテキストを強調表示したままにするように見えました。
テキストを新しい文字列に設定する前にsetText:nilを設定すると、textviewがリセットされ、電話番号が通常どおり強調表示されることがわかりました。これがiOS 7.0のUITextViewの何らかのバグかどうか疑問に思っています
いずれにせよ、これは私にとってはうまくいきました。
IOS7が最初に登場したとき、これは私を悩ませ、このスレッドで答えを見つけました(実際の値を設定する前にUITextViewのテキスト属性をnilに設定することはトリックを行いました)。その後、突然、問題(私にとっては、文字列全体がリンクとして強調表示されていた)が再び発生しました(iOSの更新によるものと思われます)。
最終的に私にとってのトリックは、テキスト属性の使用を停止し、attributedTextを設定することでした。これを行ったら、fonts/scrolling/selectable/editable/etcを設定する必要があります。プログラムで消えました。 IBでUITextViewを定義し、必要に応じて値を設定し(スクロール、編集、選択、リンクと電話番号の検出)、属性付きの文字列を作成して設定します。
myUITextView.attributedString = myAttributedString;
そして突然、すべてが期待どおりに機能しました。これが将来の誰かに役立つことを願っています。
同じ問題が発生し、UITextViewのスクロールを無効にすると、ユーザーがtextviewと対話した後にのみ動作するのではなく、ロード時にリンク検出がアクティブになります。 UITextViewも選択可能および編集不可でなければなりませんでした。
detailTextView.scrollEnabled = NO;
detailTextView.editable = NO;
detailTextView.selectable = YES;
IOS6では、選択可能またはスクロールを有効にする必要はありません。
確認するもう1つのことは、セルとセルのコンテンツビューでuserinteractionが有効になっていることです。そうでない場合、リンクはクリックできません。
textview
セルのUItableView
のデータ検出プロパティを使用するには、[これらの行を追加する必要があります]をチェックします。
txtvwMsgText.userInteractionEnabled = YES;
txtvwMsgText.dataDetectorTypes = UIDataDetectorTypeLink;
txtvwMsgText.scrollEnabled = NO;
txtvwMsgText.editable = NO;
txtvwMsgText.selectable = YES;
NSDataDetector
をチェックアウトする必要があります。
これを使用して、さまざまなデータ(リンク、電話番号など)を検索して処理できます。このサイトをご覧ください:
http://nshipster.com/nsdatadetector/
dataDetectorTypes
のUITextView
プロパティを使用して、コードで検出するものを設定することもできます。ストーリーボードの移行の問題にすぎないかもしれません。
textView.dataDetectorTypes = UIDataDetectorTypeLink;
編集不可の場合にのみ、テキストビューがリンクを認識することに注意してください!
「リンク検出」でeditable UITextView
を作成する方法に関する素敵なチュートリアルがあります
私は今までそのソリューションで問題を経験していません。
トリックは、GestureRecognizerタッチを警告し、編集を有効/無効にすることです。
selectable / not selectable
のiOS7
の問題にも同じことを適用できます
いくつかのテストの後、解決策を見つけました。
リンクをアクティブにし、選択を有効にしない場合は、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)で動作するはずです。私はそれが役立つことを願っています! :)
トリックを見つけました、これはiOS 7で動作します!
あなたはあなたのxibまたはプログラムで選択可能なUITextViewを設定する必要があります
self.yourTextView.selectable = YES;
そして、スクロールを無効にして、テキストを設定した後に再度有効にする必要があります。
self.yourTextView.scrollEnabled = NO;
[self.yourTextView setText:contentString];
self.yourTextView.scrollEnabled = YES;
そのため、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この問題が修正されるまで)、コードを使用して不要な混乱を避けることをお勧めします。
色合いの色を他の色に変更すると、実際に機能します。ただし、選択可能な場合、色合いも同じ色になります。
UITextViewsのスクロール機能を無効にすると、同様の設定でうまくいきました。
UITextViewのスクロールプロパティをNoにします。動作します... Self.textView.ScrollingEnable = NO;
この回避策は私のために働く:
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;
}
}
プログラムでUITextviewを追加する場合は、以下の行を追加するだけです。
_textView.userInteractionEnabled = YES;
_textView.dataDetectorTypes = UIDataDetectorTypeLink;
_textView.scrollEnabled = NO;
_textView.editable = NO;
これは私のために働いた。
このスレッドは古いですが、Swiftでうまくいく答えが見つからなかったので、Swift 2.2
textView.dataDetectorTypes = UIDataDetectorTypes.Link
textView.selectable = true
上記のどれも私にとってはうまくいきませんでしたが、代わりにこれを行いました:
[self.textView setDataDetectorTypes:UIDataDetectorTypeNone];
[self.textView.setTextColor:[UIColor whiteColor]];
[self.textView setDataDetectorTypes:UIDataDetectorTypeNone];
私はすべてのタイプを検出するはずのテキストビューでこれを行いましたが、検出されていない色は白に設定されていました。コードを変更して、検出する適切な色とリンクの種類を表すことができます。