У меня есть вид, который рисует некоторый текст, используя coretext. Все работает отлично, текст показывает правую сторону вверх, перелистывая координаты. Однако я также должен реагировать на прикосновения к определенным прогонам, поэтому у меня есть следующий код, который вызывается при срабатывании распознавателя жестов касания:
- (void)receivedTap:(UITapGestureRecognizer*)recognizer
{
CGPoint point = [recognizer locationInView:self];
NSLog(@"point = %@", NSStringFromCGPoint(point));
CGContextRef context = UIGraphicsGetCurrentContext();
CFArrayRef lines = CTFrameGetLines(textFrame);
CFIndex lineCount = CFArrayGetCount(lines);
CGPoint origins[lineCount];
CTFrameGetLineOrigins(textFrame, CFRangeMake(0, 0), origins);
for(CFIndex idx = 0; idx < lineCount; idx++)
{
CTLineRef line = CFArrayGetValueAtIndex(lines, idx);
CGRect lineBounds = CTLineGetImageBounds(line, context);
lineBounds.origin.y += origins[idx].y;
if(CGRectContainsPoint(lineBounds, point))
{
CFArrayRef runs = CTLineGetGlyphRuns(line);
for(CFIndex j = 0; j < CFArrayGetCount(runs); j++)
{
CTRunRef run = CFArrayGetValueAtIndex(runs, j);
NSDictionary* attributes = (NSDictionary*)CTRunGetAttributes(run);
BOOL result = NO;
NSURL* url = [attributes objectForKey:kJTextViewDataDetectorLinkKey];
NSString* phoneNumber = [attributes objectForKey:kJTextViewDataDetectorPhoneNumberKey];
NSDictionary* addressComponents = [attributes objectForKey:kJTextViewDataDetectorPhoneNumberKey];
if(url)
{
result = [[UIApplication sharedApplication] openURL:url];
return;
}
else if(phoneNumber)
{
NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"tel://%@", phoneNumber]];
result = [[UIApplication sharedApplication] openURL:url];
return;
}
else if(addressComponents)
{
NSMutableString* address = [NSMutableString string];
NSString* temp = nil;
if((temp = [addressComponents objectForKey:NSTextCheckingStreetKey]))
[address appendString:temp];
if((temp = [addressComponents objectForKey:NSTextCheckingCityKey]))
[address appendString:[NSString stringWithFormat:@"%@%@", ([address length] > 0) ? @", " : @"", temp]];
if((temp = [addressComponents objectForKey:NSTextCheckingStateKey]))
[address appendString:[NSString stringWithFormat:@"%@%@", ([address length] > 0) ? @", " : @"", temp]];
if((temp = [addressComponents objectForKey:NSTextCheckingZIPKey]))
[address appendString:[NSString stringWithFormat:@" %@", temp]];
if((temp = [addressComponents objectForKey:NSTextCheckingCountryKey]))
[address appendString:[NSString stringWithFormat:@"%@%@", ([address length] > 0) ? @", " : @"", temp]];
NSString* urlString = [NSString stringWithFormat:@"http://maps.google.com/maps?q=%@", [address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
result = [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
return;
}
}
}
}
}
Который работает для первой строки, если, например, для веб-адреса, над которым я выполняю обнаружение некоторых данных. Я нажимаю на него, и Mobile Safari запускается, как я и ожидал. Однако это работает, только если элемент находится на первой строке. Я вижу текст, выделенный цветом и подчеркнутый (для таких вещей, как адреса и телефонные номера) в других строках, и я убедился, что соответствующие данные прикреплены к моим настраиваемым атрибутам в строке, но когда я нажимаю их, ничего не происходит.
Я знаю, что мне нужно как-то перевернуть прямоугольник lineBounds
, но я не уверен, как это сделать. Любая помощь будет принята с благодарностью.