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
Django中url以及請求響應
1、url傳遞引數 1、非關鍵字引數 url地址訪問格式:/路徑/路徑/引數 urls正則的定義:/路徑/路徑/(引數匹配的正則) 注意: 1、如果要獲取傳遞進來的引數,必須給對應的引數的正則加上()才可以提取 2、如果url中有引數,就必須在檢視函式的形式引數上定義
iOS開發中使用OC和swift的對比
背景: 為了更好地學習,本人決定將學習的swift和OC進行下對比。 對比: 1.import的類 OC:某個只要要使用某個類就要將該類import。 swift:如果是使用者自己建立類,其他類無需import可以直接使用。pod的一些三方類和系統的
iOS開發中實現OC和Swift的混編
背景: 最近又開始看了一些關於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方法請求網路資料,有時會遇到請求失敗的問題,於是各種找原因,就是不明白問題出在哪裡。我也是遇到了這種問題最後才發現我本來請求接口裡有個“+”,而到伺服器端反饋給我的資訊顯示變成了空格“ ”,後來才反應
SpringMVC中url-pattern /和/*的區別
學習Spring的時候,在配置web.xml的時候,把url-pattern 配置成/*,啟動專案後去訪問自己的Controller總是報404.檢查了很多發現資源是存在的,配置的地址也沒有問題,為什麼會出現404錯誤呢?最後發現是自己配置的 url-patte
iOS工程中開發環境和釋出環境的切換
這篇文件主要是解決以下兩個在開發時經常遇到的問題: 1、 在開發時,有一些程式碼僅在開發時執行,發版時不能執行。比如:測試用的mock資料、自動登入以方便除錯應用、在本次上線時不上線的功能等。 2、 測試人員需要在測試伺服器和線上伺服器間來回切換
iOS開發中的UDID和UUID詳解
今天突然想和大家聊聊UDID和UUID的問題,雖然平時我們對這兩個東西很忽視,往往也很難區分這兩個東西。今天就來好好談談。【UDID】 UDID的全名為 Unique Device Identifier :裝置唯一識別符號。從名稱上也可以看出,UDID
iOS 5中的strong和weak關鍵字
iOS 5 中對屬性的設定新增了strong 和weak關鍵字來修飾屬性 strong 用來修飾強引用的屬性; @property (strong) SomeClass * aObject; 對應原來的 @property (retain) SomeClass * aObj
web.xml中url-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 NSMutableDictionary中UIImage的存儲和讀取
轉換成 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.