NSString * const KILabelLinkTypeKey = @"linkType";
NSString * const KILabelRangeKey = @"range";
NSString * const KILabelLinkKey = @"link";
typedef NS_ENUM(NSUInteger, KILinkType)
{
KILinkTypeUserHandle,
KILinkTypeHashtag,
KILinkTypeURL,
}
- (NSArray *)getRangesForURLs:(NSAttributedString *)text
{
NSMutableArray *rangesForURLs = [[NSMutableArray alloc] init];;
// Use a data detector to find urls in the text
NSError *error = nil;
NSDataDetector *detector = [[NSDataDetector alloc] initWithTypes:NSTextCheckingTypeLink error:&error];
NSString *plainText = text.string;
NSArray *matches = [detector matchesInString:plainText
options:0
range:NSMakeRange(0, text.length)];
// Add a range entry for every url we found
for (NSTextCheckingResult *match in matches)
{
NSRange matchRange = [match range];
// If there's a link embedded in the attributes, use that instead of the raw text
NSString *realURL = [text attribute:NSLinkAttributeName atIndex:matchRange.location effectiveRange:nil];
if (realURL == nil)
realURL = [plainText substringWithRange:matchRange];
if ([match resultType] == NSTextCheckingTypeLink)
{
[rangesForURLs addObject:@{KILabelLinkTypeKey : @(KILinkTypeURL),
KILabelRangeKey : [NSValue valueWithRange:matchRange],
KILabelLinkKey : realURL,
}];
}
}
return rangesForURLs;
}
#pragma mark - Interactions
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesMoved:touches withEvent:event];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesEnded:touches withEvent:event];
if (self.linkRanges.count > 0) {
NSDictionary * tmpdic = self.linkRanges[0];
NSString * url = tmpdic[@"link"];
LOGD(@"*********************** url : %@",url);
if (url.length > 0) {
[self attemptOpenURL:[NSURL URLWithString:url]];
}
}
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesCancelled:touches withEvent:event];
}
- (void)attemptOpenURL:(NSURL *)url
{
BOOL safariCompatible = [url.scheme isEqualToString:@"http"] || [url.scheme isEqualToString:@"https"];
if (safariCompatible && [[UIApplication sharedApplication] canOpenURL:url])
{
[[UIApplication sharedApplication] openURL:url];
}
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Problem"
message:@"The selected link cannot be opened."
delegate:nil
cancelButtonTitle:@"Dismiss"
otherButtonTitles:nil];
[alert show];
}
}