Mam pewien kod w widoku, który rysuje jakiś przypisany tekst za pomocą CoreText. W tym szukam adresów URL i sprawię, że będą niebieskie. Pomysł polega na tym, aby nie obciążać wszystkich kosztami, aby uzyskać klikalne linki. Gdy użytkownik kliknie na ten link (nie całą komórkę widoku tabeli), chcę odpalić metodę delegata, która będzie następnie używana do przedstawienia widoku modalnego zawierającego widok internetowy przechodzący do tego adresu URL.Używanie CoreText i dotknięć, aby utworzyć klikalną akcję
Zapisuję ścieżkę i łańcuch jako zmienne instancji widoku, a kod rysunku występuje w -drawRect:
(pominięto to dla zwięzłości).
Mój touch machine jednak, mimo że niekompletny, nie drukuje tego, czego oczekiwałbym. To jest poniżej:
- (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
}
}
}
}
}
To nie jest najładniejszy kod w tej chwili, ja wciąż staram się po prostu sprawiają, że działa, więc wybacz jakość kodu.
Problem polega na tym, że gdy klikam poza linkiem, to, czego się spodziewam, stanie się: Nic się nie zwalnia.
Jednak Spodziewam się "Tapped line"
aby wydrukowane gdybym dotknij tej samej linii link jest włączony, który się nie dzieje, a ja się spodziewać zarówno "Tapped line"
i "Tapped run"
aby wydrukowane gdybym dotknij URL.
Nie jestem pewien, gdzie to zrobić dalej, zasoby, na które patrzyłem, aby rozwiązać tę kwestię, są specyficzne dla kakao (co prawie zupełnie nie ma zastosowania) lub brakuje informacji na temat tego konkretnego przypadku.
Z chęcią zabiorę wskaźniki do dokumentacji, która szczegółowo wyjaśni, jak właściwie przejść do wykrycia, czy dotknięcie wystąpiło w obrębie podstawowego tekstu rysującego kod, ale w tym momencie chcę tylko rozwiązać ten problem, więc wszelkie pomoc byłaby bardzo ceniona.
AKTUALIZACJA: Zawęziłem mój problem do kwestii współrzędnych. Odwróciłem współrzędne (a nie jak pokazano powyżej), a problem, który dostaję, dotyka rejestru tak, jak się spodziewałem, ale przestrzeń współrzędnych jest odwrócona i nie mogę jej odwrócić.
Brałeś pod uwagę fakt, że CoreText wykorzystuje obróconą układ współrzędnych? Teraz wydaje mi się, że porównujesz rzeczy w dwóch różnych układach współrzędnych. – Jacques
Nie jest również dobrym pomysłem odtworzenie oprawki przy każdym takim dotknięciu. Tworzenie framesettera jest bardzo kosztowne, więc powinieneś go buforować przy pierwszym rysowaniu lub ustawianiu tekstu. – Jacques
Moja metodologia rozwoju to po prostu: 1) Spraw, aby działała; 2) Zrób to dobrze; 3) Spraw, by była szybka/czysta. Zajmijmy się # 2, gdy otrzymamy # 1 wracając :) Także w odniesieniu do układu współrzędnych, tak, zdaję sobie z tego sprawę, i przez jakiś czas go nie obsługiwałem.W kodeksie teraz, po konsultacji z kolegą, postawił mnie prosto na to, i to przynajmniej wykrywa krany na liniach, po prostu nie przebiega. Wciąż próbuję to rozgryźć. – jer