У меня есть некоторый код в представлении, который рисует некоторый приписанный текст, используя CoreText.В этом я ищу URL и делаю их синими.Идея состоит в том, чтобы не вносить все издержки UIWebView
только для того, чтобы получать кликабельные ссылки.Когда пользователь нажимает на эту ссылку (а не на всю ячейку табличного представления), я хочу запустить метод делегата, который затем будет использован для представления модального представления, содержащего веб-представление, переходящее по этому URL.
Я сохраняю путь и саму строку как переменные экземпляра представления, и код рисования происходит в -drawRect:
(я оставил это для краткости).
Мой обработчик касания, хотя и не завершенне печатает то, что я ожидал.Это ниже:
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInView:self];
CGContextRef context = UIGraphicsGetCurrentContext();
NSLog(@"attribString = %@", self.attribString);
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)self.attribString);
CTFrameRef ctframe = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, self.attribString.length), attribPath, NULL);
CFArrayRef lines = CTFrameGetLines(ctframe);
for(CFIndex i = 0; i < CFArrayGetCount(lines); i++)
{
CTLineRef line = CFArrayGetValueAtIndex(lines, i);
CGRect lineBounds = CTLineGetImageBounds(line, context);
// Check if tap was on our line
if(CGRectContainsPoint(lineBounds, point))
{
NSLog(@"Tapped line");
CFArrayRef runs = CTLineGetGlyphRuns(line);
for(CFIndex j = 0; j < CFArrayGetCount(runs); j++)
{
CTRunRef run = CFArrayGetValueAtIndex(runs, j);
CFRange urlStringRange = CTRunGetStringRange(run);
CGRect runBounds = CTRunGetImageBounds(run, context, urlStringRange);
if(CGRectContainsPoint(runBounds, point))
{
NSLog(@"Tapped run");
CFIndex* buffer = malloc(sizeof(CFIndex) * urlStringRange.length);
CTRunGetStringIndices(run, urlStringRange, buffer);
// TODO: Map the glyph indices to indexes in the string & Fire the delegate
}
}
}
}
}
Это не самый красивый код на данный момент, я все еще пытаюсь просто заставить его работать, так что простите за качество кода.
Проблема в том, что ято, что, когда я нажимаю за пределами ссылки, происходит то, что, как я ожидаю, произойдет: ничего не срабатывает.
Однако я ожидаю, что "Tapped line"
будет напечатано, если я нажму на ту же строку, на которой находится ссылка,что не произойдет, и я ожидаю, что и "Tapped line"
, и "Tapped run"
будут напечатаны, если я нажму на URL.
Я не уверен, где взять это дальше, ресурсы, которые я 'Мы рассмотрели для решения этой проблемы специфические для Какао (которые почти полностью неприменимы), или не хватает информации по этому конкретному случаю.
Я с удовольствием возьму указатели на документацию, которая подробно описывает, как правильно обнаружить, еслиприкосновение произошло в рамках основного текста, рисующего код, но на данный момент я просто хочу решить эту проблему, поэтому любая помощь будет принята с благодарностью.
ОБНОВЛЕНИЕ : IчасЯ сузил мою проблему до проблемы координат.Я перевернул координаты (а не как показано выше), и проблема, которую я получаю, состоит в том, что касания регистрируются, как я ожидал, но пространство координат перевернуто, и я не могу перевернуть его обратно.