UILabel + NSAttributedString + click

TofTof Membre
août 2014 modifié dans API UIKit #1

Bonjour,


 


Vous allez sans doute pouvoir m'aider.


 


Voici le contexte : J'ai une UILabel dont la propriété attributedText est initialisée avec un objet NSAttributedString. Le texte dans le l'objet est formaté avec des couleurs et des fonts différentes. Ce que j'aimerai c'est récupérer le texte de couleur sur lequel l'utilisateur a cliqué.


 


Pour ça je me suis fait une classe qui hérité de UILabel avec un objet UITapGestureRecognizer pour detecter où l'utilisateur clique. Quand il clique sur l'UILabel je fais ceux-ci :



- (void)handleTap:(UITapGestureRecognizer *)pSender {
  if (pSender.state == UIGestureRecognizerStateEnded) {
    CGPoint lPoint = [pSender locationInView:self];
    
    NSRange lRange = NSMakeRange(0, [self.attributedText length]);
    [self.attributedText enumerateAttributesInRange:lRange
                                            options:kNilOptions
                                         usingBlock:^(NSDictionary *pAttrs, NSRange pRange, BOOL *pStop) {
                                             CGRect lRect = [self rectWithRange:pRange];
                                             
                                             if (CGRectContainsPoint(lRect, lPoint)) {
// L'utilisateur a cliqué sur cette séquence
                                               *pStop = YES;
                                             }

                                         }];
  }
}

La méthode rectWithRange: doit me retourner les coordonnée du NSRange que j'examine. Le pb c'est que cette méthode ne marche pas bien. En fonction du texte qu'il y a dans la propriété attributText j'arrive ou pas à  obtenir les bonnes coordonnées.


 


Voici le code rectWithRange:



- (CGRect)rectWithRange:(NSRange)pRange {
  CGRect           lRet = CGRectZero;
  CGSize           lSize = self.frame.size;
  NSTextStorage   *lTextStorage = [[NSTextStorage alloc] initWithAttributedString:self.attributedText];
  NSLayoutManager *lLayoutManager = [[NSLayoutManager alloc] init];
  NSTextContainer *lTextContainer = [[NSTextContainer alloc] initWithSize:lSize];
  NSRange          lGlyphRange;
 
  lTextContainer.lineBreakMode = self.lineBreakMode;
  lTextContainer.lineFragmentPadding = 0;
 
  [lTextStorage addLayoutManager:lLayoutManager];
  [lLayoutManager addTextContainer:lTextContainer];
 
  [lLayoutManager characterRangeForGlyphRange:pRange actualGlyphRange:&lGlyphRange];
 
  lRet = [lLayoutManager boundingRectForGlyphRange:lGlyphRange inTextContainer:lTextContainer];
 
  return lRet;
}

Est ce que vous pourriez m'aider à  mettre au point cette méthode ?


Juste pour info pour différentes raisons je ne peux pas utiliser une UITextView je dois rester avec une UILabel, ou une classe dérivé.


D'avance merci pour l'aide que vous pourrez m'apporter :)

Tof


Connectez-vous ou Inscrivez-vous pour répondre.