2014-07-26 11 views
7

Ho un UILabel con una stringa simile al tweet, incluse le citazioni di altri utenti.layoutManager boundingRectForGlyphRange: inTextContainer: non funziona con tutte le stringhe

Hey @stephen and @frank and @Jason1. 

Sto tentando di fare in modo che ogni voce sia selezionabile in modo che possa caricare il profilo di quell'utente. Ho trovato del codice da un altro post SO (How do I locate the CGRect for a substring of text in a UILabel?) che ero in grado di usare per localizzare la posizione di ogni menzione nella stringa. Tuttavia di solito non funziona per le ultime o ultime 2 menzioni in un post.

Il metodo dal SO Post (leggermente modificato):

- (CGRect)boundingRectForCharacterRange:(NSRange)range 
{ 
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithAttributedString:self.myLabel.attributedText]; 
    NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:attributedString]; 
    NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init]; 
    [textStorage addLayoutManager:layoutManager]; 
    NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:self.myLabel.bounds.size]; 
    textContainer.lineFragmentPadding = 0; 
    [layoutManager addTextContainer:textContainer]; 

    NSRange glyphRange; 

    // Convert the range for glyphs. 
    [layoutManager characterRangeForGlyphRange:range actualGlyphRange:&glyphRange]; 

    return [layoutManager boundingRectForGlyphRange:glyphRange inTextContainer:textContainer]; 
} 

Poi, nel touchesEnded:, ho un ciclo su ogni menzione, ottenere la gamma nella stringa principale, e verificare se il tocco è all'interno di quella CGRect .

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{   
    UITouch *touch = touches.allObjects[0]; 

    for (NSString *mention in self.mentions) { 
     NSRange range = [self.postText rangeOfString:mention options:NSCaseInsensitiveSearch]; 
     CGRect rect = [self boundingRectForCharacterRange:range]; 
     NSLog(@"rect for %@ is %@", mention, NSStringFromCGRect(rect)); 
    } 
} 

// Output from above 
rect for @stephen is {{33.388, 0}, {72.471001, 20.553001}} 
rect for @frank is {{143.021, 0}, {49.809998, 20.553001}} 
rect for @Jason1 is {{0, 0}, {0, 0}} 

E questo funziona alla grande il più delle volte, tuttavia @ Jason1 non viene abbinato. Ho cambiato l'ordine dei nomi ed è sempre l'ultimo. La mia etichetta si chiude, ma a volte corrisponde ancora ai nomi sulla 2a e 3a linea. C'è un ambiente o qualcosa che mi manca? Ho provato a cambiare la dimensione e il carattere delle etichette, ma senza fortuna. Sono in una vera perdita qui.

+1

Hai risolto? Per favore condividi la soluzione se ne hai. –

risposta

10

La correzione per questo non è impostare il vincolo di altezza durante l'inizializzazione di NSTextContainer. Utilizzare invece un numero molto grande.

NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:CGSizeMake(self.myLabel.bounds.size.width, CGFLOAT_MAX)]; 
+0

Su iOS7, dovresti usare questo metodo. Ma su iOS8 e versioni successive, puoi usare label.size felicemente. – generalzyq

Problemi correlati