iOS 自動識別URL(連結)功能的實現

來源:互聯網
上載者:User

標籤:如何   顯示   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(連結)功能的實現

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.