You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
3.9 KiB
92 lines
3.9 KiB
// |
|
// XHMessageBubbleHelper.m |
|
// MessageDisplayExample |
|
// |
|
// Created by 曾 宪华 on 14-6-2. |
|
// Copyright (c) 2014年 曾宪华 开发团队(http://iyilunba.com ) 本人QQ:543413507 本人QQ群(142557668). All rights reserved. |
|
// |
|
#import <UIKit/UIKit.h> |
|
|
|
#import "XHMessageBubbleHelper.h" |
|
|
|
@interface XHMessageBubbleHelper () { |
|
NSCache *_attributedStringCache; |
|
} |
|
|
|
@end |
|
|
|
@implementation XHMessageBubbleHelper |
|
|
|
+ (instancetype)sharedMessageBubbleHelper { |
|
static XHMessageBubbleHelper *sharedInstance = nil; |
|
|
|
static dispatch_once_t onceToken; |
|
dispatch_once(&onceToken, ^{ |
|
sharedInstance = [[XHMessageBubbleHelper alloc] init]; |
|
}); |
|
|
|
return sharedInstance; |
|
} |
|
|
|
- (id)init { |
|
self = [super init]; |
|
if (self) { |
|
_attributedStringCache = [[NSCache alloc] init]; |
|
} |
|
return self; |
|
} |
|
|
|
- (void)setDataDetectorsAttributedAttributedString:(NSMutableAttributedString *)attributedString |
|
atText:(NSString *)text |
|
withRegularExpression:(NSRegularExpression *)expression |
|
attributes:(NSDictionary *)attributesDict { |
|
[expression enumerateMatchesInString:text |
|
options:0 |
|
range:NSMakeRange(0, [text length]) |
|
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { |
|
NSRange matchRange = [result range]; |
|
if (attributesDict) { |
|
[attributedString addAttributes:attributesDict range:matchRange]; |
|
} |
|
|
|
if ([result resultType] == NSTextCheckingTypeLink) { |
|
NSURL *url = [result URL]; |
|
[attributedString addAttribute:NSLinkAttributeName value:url range:matchRange]; |
|
} else if ([result resultType] == NSTextCheckingTypePhoneNumber) { |
|
NSString *phoneNumber = [result phoneNumber]; |
|
[attributedString addAttribute:NSLinkAttributeName value:phoneNumber range:matchRange]; |
|
} else if ([result resultType] == NSTextCheckingTypeDate) { |
|
// NSDate *date = [result date]; |
|
} |
|
}]; |
|
} |
|
|
|
- (NSAttributedString *)bubbleAttributtedStringWithText:(NSString *)text { |
|
if (!text) { |
|
return [[NSAttributedString alloc] init]; |
|
} |
|
if ([_attributedStringCache objectForKey:text]) { |
|
return [_attributedStringCache objectForKey:text]; |
|
} |
|
|
|
NSDictionary *textAttributes = @{NSForegroundColorAttributeName : [UIColor colorWithRed:0.185 green:0.583 blue:1.000 alpha:1.000]}; |
|
|
|
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:text]; |
|
|
|
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink | NSTextCheckingTypePhoneNumber | NSTextCheckingTypeDate |
|
error:nil]; |
|
|
|
[self setDataDetectorsAttributedAttributedString:attributedString atText:text withRegularExpression:detector attributes:textAttributes]; |
|
|
|
|
|
// NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"/s(13[0-9]|15[0-35-9]|18[0-9]|14[57])[0-9]{8}" |
|
// options:0 |
|
// error:nil]; |
|
// [self setDataDetectorsAttributedAttributedString:attributedString atText:text withRegularExpression:regex attributes:textAttributes]; |
|
|
|
[_attributedStringCache setObject:attributedString forKey:text]; |
|
|
|
return attributedString; |
|
} |
|
|
|
@end
|
|
|