簡體   English   中英

iOS 7中的UITextView鏈接檢測

[英]UITextView link detection in iOS 7

我有一個UITextView ,它通過Interface Builder進行管理。 作為數據檢測,我檢查了“鏈接”。 在iOS 6中,一切正常,鏈接突出顯示且可點擊。 但是在iOS 7中,所有鏈接仍然只是純文本。 未選中可編輯和可選擇的復選框。

可能引起關注的是UITextView是容器視圖的子視圖,它再次位於UIScrollView

似乎在iOS 7中鏈接檢測僅在UITextView可選時才有效。 因此,使我的UITextView無法選擇會阻止鏈接檢測工作。

我也在iOS 6中對此進行了測試,我可以確認在iOS 6中鏈接檢測工作正常,即使UITextView不可選。

我今天在電話號碼檢測方面遇到了一些問題。 在我將文本設置為其他內容之后,似乎UITextView會保留舊的電話號碼並保持文本突出顯示。

我發現如果在將文本設置為新字符串之前將setText:nil設置為nil,則會重置textview,並且電話號碼會正常突出顯示。 我想知道這是否是iOS 7.0中UITextView的某種錯誤

無論哪種方式,這確實對我有用。

當iOS7第一次出現時,這困擾了我,我在這個線程中找到了答案(在設置實際值之前將UITextView的text屬性設置為nil)。 然后突然,問題(對我而言,整個字符串被突出顯示為鏈接)被重新裁剪(假設是由於iOS更新)。

對我來說最終的訣竅是停止使用text屬性並設置attributedText。 一旦我這樣做,需要設置字體/滾動/可選/可編輯/等。 以編程方式,消失了。 我在IB中定義了我的UITextView,設置了我想要的值(不可滾動,不可編輯,可選,檢測鏈接和電話號碼),然后構建了一個屬性字符串並設置:

myUITextView.attributedString = myAttributedString;

突然一切都按預期工作了。 希望這可以幫助其他人。

我遇到了同樣的問題,並且在UITextView上禁用滾動會激活加載時的鏈接檢測,而不是僅在用戶與textview交互后才開始工作。 UITextView也必須是可選擇的且不可編輯的。

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

在iOS6上不需要可選擇或啟用滾動。

要檢查的另一件事是在單元格的單元格和內容視圖上啟用了用戶交互,否則鏈接將無法單擊。

必須添加“檢查這些行”以在UItableView單元格中使用textview數據檢測器屬性。

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

你應該看看NSDataDetector

您可以使用它來查找和處理不同的數據(鏈接,電話號碼等)。 看看這個網站:

http://nshipster.com/nsdatadetector/

您還可以使用UITextViewdataDetectorTypes屬性來設置要在代碼中檢測的內容。 可能只是你的故事板過渡問題。

textView.dataDetectorTypes = UIDataDetectorTypeLink;

請注意,如果不可編輯 ,您的textview將僅識別鏈接

這是一個很好的教程,介紹如何使用`link detection``制作editable UITextView

帶鏈接檢測的可編輯UITextView

從現在開始,我沒有遇到任何問題。

訣竅是GestureRecognizer轉發觸摸並啟用/禁用編輯。

您可以在iOS7上對selectable / not selectable問題應用相同的iOS7

經過幾次測試,我找到了解決方案。

如果您希望鏈接處於活動狀態且未啟用選擇,則需要編輯gestureRecognizers。

例如 - 有3個LongPressGestureRecognizers。 一個用於單擊鏈接(minimumPressDuration = 0.12),第二個用於放大可編輯模式(minimumPressDuration = 0.5),第三個用於選擇(minimumPressDuration = 0.8)。 此解決方案刪除LongPressGestureRecognizer以進行選擇,其次用於縮放編輯模式。

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這樣的方法)。 這里的技巧是在將文本值設置為textview完成后將可編輯屬性設置為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中啟用了鏈接。 此外,我建議不要在此時使用故事板(或直到蘋果修復此問題)並且只使用代碼以避免任何不必要的混淆。 希望這有幫助。

在類似的設置中,取消激活UITextViews滾動功能對我來說很有用。

將色調顏色更改為其他顏色實際上有效。 但是,如果可選擇啟用,則色調也將是相同的顏色。

使UITextView的滾動屬性為否。它將起作用... 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;

這對我有用。

以上都沒有為我工作,而是我做了這個:

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

我用我的textview做了這個,它應該檢測所有類型,並且沒有檢測到顏色設置為白色。 您可以更改代碼以表示正確的顏色和要檢測的鏈接類型。

雖然這個帖子已經老了,但我沒有看到一個對Swift有用的答案,所以這里適用於Swift 2.2

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM