Frage

Ich habe einige in einem Touch-Handler, der auf im Hinblick auf einen Hahn antwortet, dass ich etwas zurück Text gezeichnet habe. Durch diesen, ich habe bis zu dem Punkt, wo ich eine CTRunRef (und die dazugehörige Linie) als auch die Anzahl von Glyphen in diesem Lauf.

Was ich nicht in der Lage bin leicht, herauszufinden, ist, wie ich diesen Lauf von Glyphen nehmen und, da meine zugeschrieben string, wo es sich in der Zeichenfolge Zeichen aus.

Insbesondere das Problem ist, ich möchte wissen, welches Wort der Benutzer in der Ansicht angezapft, so dass ich, ob verarbeiten kann oder nicht das Wort ist eine URL und Feuer aus einem Verfahren benutzerdefinierten Delegaten so dass ich mit ihm eine Web-Ansicht öffnen . Ich habe alle möglichen Teil, ich weiß nur nicht, wie zu kartieren, wo die auf einen bestimmten Teilzeichen angezapft Benutzer.

Jede Hilfe würde sehr geschätzt werden.

UPDATE : Ich habe tatsächlich verschwunden und es eine andere Art und Weise, auf Anregung einer anderen Person aus der Stackoverflow getan. Im Grunde, was ich getan habe, ist ein benutzerdefiniertes Attribut zu setzen, @"MyAppLinkAddress" mit dem Wert der URL Ich fand, als ich die Zeichenfolge in einer Zeichenfolge zurückführt. Dies geschieht, bevor ich die Schnur ziehen. Wenn daher ein Tap-Ereignis auftritt, überprüfe ich nur, wenn das Attribut vorhanden ist, und wenn ja, meinen Delegatmethode nennen, wenn nicht, einfach ignorieren. Es funktioniert, wie ich jetzt möchte, aber ich werde diese Frage offen für ein paar Tage verlassen, wenn jemand mit einer Antwort aufwarten kann, werde ich nehme es gerne, wenn seine eine Lösung, so dass einige andere Arbeits der Lage sein, diese Informationen nützlich zu einem bestimmten Zeitpunkt in der Zukunft zu finden.

War es hilfreich?

Lösung

So wie ich in dem Update erwähnt, wählte ich einen anderen Weg zu gehen. Stattdessen bekam ich die Idee, ein benutzerdefiniertes Attribut in der zurück Zeichenfolge zu verwenden, um meine Verbindung angeben, da ich sowieso es zum Zeitpunkt der Erstellung hatte. Also tat ich das. Da ist in meinem Touch-Handler, wenn ein Lauf angezapft wird, überprüfe ich, ob das ausführen, das Attribut hat, und wenn ja, rufen Sie meine Delegierten mit ihm. Von dort bin Laden ich glücklich eine Webansicht mit dieser URL.

Bearbeiten : Dies sind Code-Schnipsel zu erklären, was ich in dieser Antwort hat. Genießen Sie.

// When creating the attribute on your text store. Assumes you have the URL already. 
// Filled in for convenience
NSRange urlRange = [tmpString rangeOfString:@"http://www.foo.com/"];
[self.textStore addAttribute:(NSString*)kCTForegroundColorAttributeName value:(id)[UIColor blueColor].CGColor range:urlRange];
[self.textStore addAttribute:@"CustomLinkAddress" value:urlString range:urlRange];

dann ...

// Touch handling code — Uses gesture recognizers, not old school touch handling.
// This is just a dump of code actually in use, read through it, ask questions if you
// don't understand it. I'll do my best to put it in context.
- (void)receivedTap:(UITapGestureRecognizer*)tapRecognizer
{
        CGPoint point = [tapRecognizer locationInView:self];

        if(CGRectContainsPoint(textRect, point))
        {
                CGContextRef context = UIGraphicsGetCurrentContext();

                point.y = CGRectGetHeight(self.contentView.bounds) - kCellNameLabelHeight - point.y;

                CFArrayRef lines = CTFrameGetLines(ctframe);
                CFIndex lineCount = CFArrayGetCount(lines);
                CGPoint origins[lineCount];
                CTFrameGetLineOrigins(ctframe, 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);
                                        NSString* urlString = [attributes objectForKey:@"CustomLinkAddress"];
                                        if(urlString && ![urlString isEqualToString:@""])
                                        {
                                                [self.delegate didReceiveURL:[NSURL URLWithString:urlString]];
                                                UIGraphicsPopContext();
                                                return;
                                        }
                                }
                        }
                }
                UIGraphicsPopContext();
        }
}

Andere Tipps

Nachdem Sie die angezapft Linie finden, können Sie für den Index in Zeichenfolge fragen nach CTLineGetStringIndexForPosition() aufrufen. Es gibt keine Notwendigkeit, den Zugang einzelne Läufe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top