1. 程式人生 > >iOS UITextView 中 url 的檢測和響應

iOS UITextView 中 url 的檢測和響應

設定樣式

1、自定義url樣式

+ (NSDictionary *)getURLAttributeDict{

    NSMutableDictionary *attributes = (NSMutableDictionary *)[StringTools getContentAttributeDict];
    [attributes setObject:[UIColor blueColor] forKey:NSForegroundColorAttributeName];
    [attributes setObject:@1 forKey:NSUnderlineStyleAttributeName];
    [attributes set
Object:@7 forKey:NSBaselineOffsetAttributeName]; [attributes setObject:@(YES) forKey:@"TAG"]; return attributes; }

2、獲取url 的range

//網址匹配,
+ (NSArray *)rangesOfUrlInString:(NSString *)string
{
    NSError *error;
    NSString *regulaStr = @"((http[s]{0,1}|ftp)://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\
[email protected]
#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\[email protected]#$%^&*+?:_/=<>]*)?)";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regulaStr options:NSRegularExpressionCaseInsensitive error
:&error]; NSArray *arrayOfAllMatches = [regex matchesInString:string options:0 range:NSMakeRange(0, [string length])]; NSMutableArray *arrayM = [NSMutableArray array]; for (NSTextCheckingResult *match in arrayOfAllMatches) { NSString* substringForMatch = [string substringWithRange:match.range]; //NSLog(@"text中的URL連結:%@---range:(%ld, %ld)", substringForMatch, match.range.location, match.range.length); [arrayM addObject:[NSValue valueWithRange:match.range]]; } return arrayM; }

3、設定 textView 所有文字樣式

// 假如content裡包含有url地址,需要處理成連結
+ (NSMutableAttributedString *)getContentURLAttributeStr:(NSString * )string
{
    NSRange wholeRange = [string rangeOfString:string];
    NSArray *urlRanges = [self rangesOfUrlInString:string];  //網址的range

    NSMutableAttributedString *resultStr = [[NSMutableAttributedString alloc]initWithString:string];

    NSMutableDictionary *contentAttriDict = (NSMutableDictionary *)[StringTools getContentAttributeDict];

    NSMutableDictionary *urlAttriDict = (NSMutableDictionary *)[StringTools getURLAttributeDict];

    [resultStr addAttributes:contentAttriDict range:wholeRange];

    for (NSValue *rangeValue in urlRanges) {

        NSRange range = [rangeValue rangeValue];
        [urlAttriDict setObject:[string substringWithRange:range] forKey:@"URL"];
        [resultStr addAttributes:urlAttriDict range:range];
    }
    return resultStr;
}

方法一、使用手勢

缺點:在iOS11以上版本,選中文字後,就無法取消。

#pragma mark -- 點選文字詳情URL跳轉
- (void)handleTap:(UITapGestureRecognizer *)tapGest
{
    UITextView *textView = (UITextView *)tapGest.view;

    NSLayoutManager *layoutManager = textView.layoutManager;

    CGPoint location = [tapGest locationInView:textView];
    location.x -= textView.textContainerInset.left;

tmpCell.contentTextView.attributedText = [StringTools getContentURLAttributeStr:Content];

UITapGestureRecognizer *tapGR = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleTap:)];
[tmpCell.contentTextView addGestureRecognizer:tapGR];
    location.y -= textView.textContainerInset.top;

    NSUInteger characterIndex = [layoutManager characterIndexForPoint:location inTextContainer:textView.textContainer fractionOfDistanceBetweenInsertionPoints:NULL];
    if (characterIndex < textView.textStorage.length)
    {
        NSRange range;
        NSDictionary *attributes = [textView.textStorage attributesAtIndex:characterIndex effectiveRange:&range];
        if ([attributes objectForKey:@"TAG"]) //點選連結
        {
            NSString *urlStr = [attributes objectForKey:@"URL"];
            NSLog(@"url - %@",urlStr);

            WebViewController *webVC = [[WebViewController alloc]init];
            webVC.url = [NSURL URLWithString:urlStr];
            [self.superVC.navigationController pushViewController:webVC animated:YES];
        }
    }

方法二、使用textView 的代理方法

缺點:需要長按才會跳轉。輕輕的tap沒有反應。

 _txView.delegate = self;
-(BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction{

    NSLog(@"url:%@",URL.absoluteString);

    //要實現的方法
    if (_blockTextViewDidTapURL) {
        _blockTextViewDidTapURL(URL.absoluteString);
    }

    return NO; //如果返回yes,則預設開啟safari。
}
  NSMutableAttributedString *resultStr = [[NSMutableAttributedString alloc]initWithString:self.nrModel.Content];

        [resultStr addAttributes:[StringTools getContentAttributeDict] range:NSMakeRange(0, self.nrModel.Content.length)];

        NSMutableDictionary *linkAttributes = (NSMutableDictionary *)[StringTools getURLAttributeDict];
        NSArray *urlRanges = [StringTools rangesOfUrlInString:self.nrModel.Content];
        for (NSValue *rangeValue in urlRanges) {

            NSRange range = [rangeValue rangeValue];
            NSString *urlString = [self.nrModel.Content substringWithRange:range];
            [resultStr addAttribute:NSLinkAttributeName value:urlString range:range];
        }

        tmpCell.contentTextView.txView.linkTextAttributes = linkAttributes;
        tmpCell.contentTextView.txView.attributedText = resultStr;
        tmpCell.contentTextView.txView.editable = NO;
        [tmpCell.contentTextView setBlockTextViewDidTapURL:^(NSString *string) {
            [weakSelf jumpToURL:string];
        }];

相關推薦

iOS UITextView url檢測響應

設定樣式 1、自定義url樣式 + (NSDictionary *)getURLAttributeDict{ NSMutableDictionary *attributes

Djangourl以及請求響應

1、url傳遞引數 1、非關鍵字引數 url地址訪問格式:/路徑/路徑/引數 urls正則的定義:/路徑/路徑/(引數匹配的正則) 注意: 1、如果要獲取傳遞進來的引數,必須給對應的引數的正則加上()才可以提取 2、如果url中有引數,就必須在檢視函式的形式引數上定義

iOS開發使用OCswift的對比

背景: 為了更好地學習,本人決定將學習的swift和OC進行下對比。 對比: 1.import的類 OC:某個只要要使用某個類就要將該類import。 swift:如果是使用者自己建立類,其他類無需import可以直接使用。pod的一些三方類和系統的

iOS開發實現OCSwift的混編

背景: 最近又開始看了一些關於Swift的視訊、部落格、書,發現swift相對於OC使用起來更簡潔了,於是就想在原有專案中引入swift。原有的專案都是使用OC寫的,既然要在原有專案中引入swift檔案首先就要實現OC和swift的混編設定。 混編設定:

HTTP協議():請求報文響應報文

1. 請求報文格式 1.1 伺服器測試程式碼 伺服器測試程式碼: #include <stdio.h> #include <stdlib.h> #include <string.h>

ios 開發的日期時間處理(轉)

NSDate儲存的是世界標準時(UTC),輸出時需要根據時區轉換為本地時間 Dates         NSDate類提供了建立date,比較date以及計算兩個date之間間隔的功能。Date物件是不可改變的。         如果你要建立date物件並表示當前日期,你可以alloc一個NSDate物件並

iOS:UITextView、UITextField檢測使用者是否完成輸入的選擇

- (void)textViewDidChange:(UITextView *)textView{ UITextRange * selectedRange = [textView m

iOS開發URL不合法字元的轉義

    通常我們在拼接網路請求Url的時候,比如請求網路圖片,通過get方法請求網路資料,有時會遇到請求失敗的問題,於是各種找原因,就是不明白問題出在哪裡。我也是遇到了這種問題最後才發現我本來請求接口裡有個“+”,而到伺服器端反饋給我的資訊顯示變成了空格“ ”,後來才反應

SpringMVCurl-pattern //*的區別

學習Spring的時候,在配置web.xml的時候,把url-pattern 配置成/*,啟動專案後去訪問自己的Controller總是報404.檢查了很多發現資源是存在的,配置的地址也沒有問題,為什麼會出現404錯誤呢?最後發現是自己配置的 url-patte

iOS工程開發環境釋出環境的切換

這篇文件主要是解決以下兩個在開發時經常遇到的問題: 1、        在開發時,有一些程式碼僅在開發時執行,發版時不能執行。比如:測試用的mock資料、自動登入以方便除錯應用、在本次上線時不上線的功能等。 2、        測試人員需要在測試伺服器和線上伺服器間來回切換

iOS開發的UDIDUUID詳解

      今天突然想和大家聊聊UDID和UUID的問題,雖然平時我們對這兩個東西很忽視,往往也很難區分這兩個東西。今天就來好好談談。【UDID】       UDID的全名為 Unique Device Identifier :裝置唯一識別符號。從名稱上也可以看出,UDID

iOS 5的strongweak關鍵字

iOS 5 中對屬性的設定新增了strong 和weak關鍵字來修飾屬性 strong 用來修飾強引用的屬性; @property (strong) SomeClass * aObject; 對應原來的 @property (retain) SomeClass * aObj

web.xmlurl-pattern //*之間的區別

在寫springMVC小例子的時候遇到了攔截的問題,在url-pattern中引數的兩種方式 一、 <servlet-mapping> <servlet-name>springMVC</servlet-name> <

ios --轉載-從URL擷取所包含的引數,並且以字典的形式返回引數字典轉URL

- (NSString *)keyValueStringWithDict:(NSDictionary *)dict { if (dict == nil) { return nil; } NSMutableString *string = [NSMutableStr

iOS URL含有中文轉義字元時的處理

今天發現一個蛋疼的問題,服務端返回的urlString裡面有時含有中文,使用 [NSURLURLWithString:urlString]生成URL物件時,iOS客戶端不能正確進行網路請求,網上找到的URLEncode方法又不能完全解決問題.    方法1: NSS

iOS NSMutableDictionaryUIImage的存儲讀取

轉換成 ini ... nsdata init png obj get ctu 思路:將UIImage轉換成NSData,然後插入到NSMutableDictionary中。讀取時,用NSData讀出來,然後再轉換成UIImage -存儲 UIImage *image

iOS 9應用開發教程之ios9實現button的響應

ins color cto div eve class sub avi src iOS 9應用開發教程之ios9中實現button的響應 IOS9實現button的響應 button主要是實現用戶交互的。即實現響應。button實現響應的方式能夠依據

iOS-事件傳遞響應機制

系統 || 聯系 轉換 face dds average 問題 特殊 轉自:http://www.jianshu.com/p/2e074db792ba 前言: 按照時間順序,事件的生命周期是這樣的:  事件的產生和傳遞(事件如何從父控件傳遞到子控件並尋找到最合適的view

在javascript如何檢測客戶端的瀏覽器操作系統類型

asc eight lsp java user width use scrip 類型 答案:var resolution = "分辨率:" + window.screen.width + "*" + window.screen.height;, var ua

9、如何在Xamarin進行iOS真機調試發布

開發者 雙擊 src quest alt 鑰匙串 發布 如何 xxxxx 本文主要引導用戶如何使用真機調試和編譯發布。 概述 使用前的準備: 1、一臺IPhone設備 或者IPad 都行看你自己 2、一臺Mac主機和搭建好對應的xamarin.