2014-07-26 12 views
7

Tôi có một UILabel với một chuỗi tweet giống như chuỗi, bao gồm cả các đề cập của những người dùng khác.layoutManager boundingRectForGlyphRange: inTextContainer: không hoạt động đối với tất cả các chuỗi

Hey @stephen and @frank and @Jason1. 

Tôi đang cố gắng đề cập đến từng đề xuất để tôi có thể tải tiểu sử của người dùng đó. Tôi tìm thấy một số mã từ một bài SO (How do I locate the CGRect for a substring of text in a UILabel?) mà tôi đã có thể sử dụng để xác định vị trí của mỗi đề cập trong chuỗi. Tuy nhiên, nó thường không hoạt động cho 2 đề cập cuối cùng hoặc cuối cùng trong một bài đăng.

Phương pháp từ SO đường bưu điện (một chút thay đổi):

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

Sau đó, trong touchesEnded:, tôi vòng qua từng đề cập đến, có phạm vi trong chuỗi chính, và kiểm tra xem các liên lạc là bên trong CGRect rằng .

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

Và điều này hoạt động tốt nhất, tuy nhiên @ Jason1 không khớp. Tôi đã đổi thứ tự các tên và nó luôn là cái cuối cùng. Nhãn của tôi không bao bọc, nhưng đôi khi nó vẫn khớp với tên trên dòng thứ 2 và thứ 3. Có một thiết lập hoặc một cái gì đó tôi đang mất tích? Tôi đã thử thay đổi kích thước và phông chữ của các nhãn nhưng không may mắn. Tôi đang thua lỗ ở đây.

+1

Bạn đã được giải quyết chưa? Vui lòng chia sẻ giải pháp nếu bạn có bất kỳ giải pháp nào. –

Trả lời

10

Khắc phục điều này không phải là để đặt giới hạn chiều cao khi khởi tạo NSTextContainer. Sử dụng một số rất lớn để thay thế.

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

Trên iOS7, bạn nên sử dụng phương pháp này. Nhưng trên iOS8 trở lên, bạn có thể sử dụng label.size vui vẻ. – generalzyq

Các vấn đề liên quan