標籤:如何 顯示 view sha com end blog 功能 ack
在做“沃迪康”聊天功能時,甲方要求發送的網址要自動識別、並點擊能自動跳轉
在實現過程中,所有的文字都是動態擷取的,設定富文字屬性時,不能按照常規的方法
- 解決方式
- 如果只是文字,沒有表情的話,可以用UILabel和UITextView來實現
- 如果有表情的話,目前瞭解到比較容易的是用UITextView來實現
- 代碼實現
- UILabelUILabel實現方式:
本人用的第三方架構:TYAttributedLabel, 可自行去git上下載;如下,我將以自己的代碼實現,講一下自己是如何使用的,以供參考,注意,只是講解自己的思路,無法複製使用:1.匯入TYAttributedLabel標頭檔到自己需要的地方:(本人是在.h 實現下面的代碼,讀者也可在.m中聲明) @protected TYAttributedLabel *_chatText;2.在.m檔案中執行個體剛聲明的_chatText,如下: _chatText = [[TYAttributedLabel alloc] init]; //建立執行個體 _chatText.backgroundColor = [UIColor clearColor]; //設定背景色 _chatText.delegate = self; //設定代理 _chatText.textAlignment = NSTextAlignmentLeft; //設定顯示的格式--居左 _chatText.numberOfLines = 0; //設定行數不限3.給_chatText賦值--這個是個重點,請注意: NSString *URLStr = @"http://baidu.com這是一個url,這個url可以點擊跳轉到http://baidu.com的頁面上"; //給URLStr賦值 NSArray *textArray = [YZTools subStrUseURL: URLStr]; //此處請注意:YZTools是我自己平時積累方法的一個工具類, subStrUseURL這個方法是把URLStr根據URL網址來分隔成一個數組 , 下面會給出裡面的代碼,請耐心,分隔出來的數組如下@[@"http://baidu.com",@"這是一個url,這個url可以點擊跳轉到",@"http://baidu.com"]
for (NSString *text in textArray) { // 根據分隔的數組,判斷是否是url再調用TYAttributedLabel的方法來添加URL的顏色屬性和字型大小 if ([text hasPrefix:@"http"]) { [_chatText appendLinkWithText:text linkFont:[_msg textFont] linkColor:[UIColor blueColor] linkData:text]; }else { [_chatText appendText:text]; } } 4.在.m中繼承TYAttributedLabel的代理 <TYAttributedLabelDelegate>,並實現代理
#pragma mark - TYAttributedLabelDelegate- (void)attributedLabel:(TYAttributedLabel *)attributedLabel textStorageClicked:(id<TYTextStorageProtocol>)TextRun atPoint:(CGPoint)point{ NSLog(@"textStorageClickedAtPoint"); if ([TextRun isKindOfClass:[TYLinkTextStorage class]]) { NSString *linkStr = ((TYLinkTextStorage*)TextRun).linkData; if ([linkStr hasPrefix:@"http:"]) { [ [ UIApplication sharedApplication] openURL:[ NSURL URLWithString:linkStr]]; }else { UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"點擊提示" message:linkStr delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil]; [alertView show]; } }}- (void)attributedLabel:(TYAttributedLabel *)attributedLabel textStorageLongPressed:(id<TYTextStorageProtocol>)textStorage onState:(UIGestureRecognizerState)state atPoint:(CGPoint)point{ NSLog(@"textStorageLongPressed");}
上述代碼中,有個 subStrUseURL 的方法,代碼如下(可直接複製是使用): ***本人用的是類方法,讀者也可以使用對象方法***
#pragma mark - 根據URL剪下字串成數組/** 根據URL剪下數組 */+ (NSMutableArray *)subStrUseURL:(NSString *)string{ NSError *error; //可以識別url的Regex 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 *arr=[[NSMutableArray alloc]init]; NSMutableArray *rangeArr=[[NSMutableArray alloc]init]; for (NSTextCheckingResult *match in arrayOfAllMatches){ NSString* substringForMatch; substringForMatch = [string substringWithRange:match.range]; [arr addObject:substringForMatch]; [rangeArr addObject:[NSValue valueWithRange:match.range]]; } NSString *subStr=string;// for (NSString *str in arr) {// [rangeArr addObject:[self rangesOfString:str inString:subStr]];// } UIFont *font = [UIFont systemFontOfSize:20]; NSMutableAttributedString *attributedText; attributedText=[[NSMutableAttributedString alloc]initWithString:subStr attributes:@{NSFontAttributeName :font}]; NSMutableArray *urlArray = [NSMutableArray array]; //把字串根據URL剪下成數組 NSInteger index = 0; NSMutableArray *strArray = [[NSMutableArray alloc] init]; for (NSInteger i = 0; i < rangeArr.count; i++) { NSValue *value = rangeArr[i]; NSInteger valueLoction = value.rangeValue.location; NSInteger valueLength = value.rangeValue.length; if (i == 0 && valueLoction != 0) { [strArray addObject:[string substringWithRange:NSMakeRange(0, valueLoction)]]; index = valueLoction; } if (index != valueLoction) { [strArray addObject:[string substringWithRange:NSMakeRange(index, valueLoction - index)]]; index = index + valueLength; } [strArray addObject:[string substringWithRange:NSMakeRange(valueLoction, valueLength)]]; index = index + valueLength; if (i == rangeArr.count - 1 && (valueLoction + valueLength != string.length)) { [strArray addObject:[string substringWithRange:NSMakeRange(valueLength + valueLoction, string.length - valueLength - valueLoction)]]; } } if (rangeArr.count == 0) { [strArray addObject:string]; } NSLog(@"----strArray = %@", strArray); //擷取string的URL全部連結 for(NSValue *value in rangeArr) { NSInteger index=[rangeArr indexOfObject:value]; [urlArray addObject:[NSURL URLWithString:[arr objectAtIndex:index]]]; } return strArray;}//擷取尋找字串在母串中的NSRange+ (NSValue *)rangesOfString:(NSString *)searchString inString:(NSString *)str { NSRange searchRange = NSMakeRange(0, [str length]); NSRange range; if ((range = [str rangeOfString:searchString options:0 range:searchRange]).location != NSNotFound) { searchRange = NSMakeRange(NSMaxRange(range), [str length] - NSMaxRange(range)); } return [NSValue valueWithRange:range];}
iOS 自動識別URL(連結)功能的實現