Question

J'ai quelques-uns dans un gestionnaire de contact qui répond à un robinet sur une vue que j'ai rédigé un texte attribué à. Grâce à cela, je suis arrivé au point où j'ai un CTRunRef (et la ligne associés) ainsi que le nombre de glyphes dans cette course.

Ce que je ne suis pas en mesure de comprendre facilement, comment je peux prendre cette série de Glyphes et, compte tenu de ma chaîne attribuée, la carte hors de caractères dans la chaîne.

Plus précisément, le problème est que je voudrais savoir quel mot l'utilisateur tape sur la vue, afin que je puisse traiter si oui ou non ce mot est une URL et de déclencher une méthode déléguée personnalisée afin que je puisse ouvrir une vue web avec elle . J'ai tous les sous-chaîne possible, je ne sais pas comment la carte où l'utilisateur choisi pour une sous-chaîne particulière.

Toute aide serait grandement appréciée.

UPDATE : Je l'ai fait parti et fait une autre façon, sur la suggestion d'une autre personne hors de stackoverflow. En fait ce que je l'ai fait est de définir un attribut personnalisé, @"MyAppLinkAddress" avec la valeur de l'URL que je trouve quand je convertissait la chaîne à une chaîne attribuée. Cela se produit avant que je dessine la chaîne. Par conséquent, lorsqu'un événement se produit du robinet, je vérifie simplement si cet attribut existe, et si oui, appelle ma méthode déléguée, sinon, ignorez. Il travaille comme je voudrais, mais je vais laisser cette question ouverte pendant quelques jours, si quelqu'un peut trouver une réponse, je l'accepte avec plaisir si sa une solution de travail pour que d'autres peut être en mesure de trouver cette information utile à un moment donné dans l'avenir.

Était-ce utile?

La solution

Comme je l'ai mentionné dans la mise à jour, j'ai choisi d'emprunter une autre voie. Au lieu de cela j'ai eu l'idée d'utiliser un attribut personnalisé dans la chaîne attribuée à préciser mon lien, depuis que je l'avais au moment de la création de toute façon. Donc, je l'ai fait. Ensuite, dans mon gestionnaire de contact, quand une course est prélevée, je vérifie si ce terme a cet attribut, et le cas échéant, appeler mon délégué avec lui. De là, je suis heureux de charger une WebView avec cette URL.

EDIT : Voici des extraits de code expliquant ce que je faisais dans cette réponse. Profitez.

// 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];

puis ...

// 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();
        }
}

Autres conseils

Après avoir trouvé la ligne taraudée, vous pouvez demander l'index dans la chaîne en appelant CTLineGetStringIndexForPosition(). Il n'y a pas besoin d'accéder à runs individuels.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top