2014-07-26 12 views
7

Diğer kullanıcılardan bahsettikleri gibi tweet benzeri bir dizeyle UILabel'ım var.layoutManager boundingRectForGlyphRange: inTextContainer: tüm dizeler için çalışmaz

Hey @stephen and @frank and @Jason1. 

Her kullanıcının atılabilir olması için bu kullanıcının profilini yükleyebilmem için çalışıyorum. Dizede her bir konuşmanın konumunu bulmak için kullanabileceğim başka bir SO posta kodu (How do I locate the CGRect for a substring of text in a UILabel?) buldum. Ancak genellikle bir yazıdaki son veya son 2 söz için çalışmaz.

(biraz değiştirilmiş) SO görevinden yöntemi: touchesEnded: yılında Sonra

- (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]; 
} 

, her söz üzerine ben döngü, ana dizesinde aralığı almak ve dokunmatik o CGRect içinde olup olmadığını kontrol edin .

- (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}} 

Ve bu çoğu zaman harika çalışıyor, ancak @ Jason1 eşleşmiyor. İsimlerin sırasını değiştirdim ve her zaman sonuncusu. Etiketim sarılıyor, ancak bazen 2. ve 3. satırlardaki adlarla eşleşiyor. Eksik olduğum bir ayar mı var? Etiketlerin boyutunu ve yazı tipini değiştirmeyi denedim, ancak şans yok. Burada gerçek bir kayıp yaşıyorum.

+1

Çözdünüz mü? Varsa, lütfen çözümü paylaşın. –

cevap

10

Bunun için düzeltme, NSTextContainer'ı başlatırken yükseklik sınırını ayarlamak değil. Bunun yerine çok büyük bir sayı kullanın.

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

iOS7'de, bu yöntemi kullanmalısınız. Ancak iOS8 ve üstü sürümlerde label.size'yi mutlu bir şekilde kullanabilirsiniz. – generalzyq

İlgili konular