2013-07-01 3 views
2

Я пытаюсь понять способ понять, в каком диапазоне экземпляр UILabel будет обрезать текст. Я знаю, как получить размер, который займет строка, используя -sizeWithFont:constrainedToSize:lineBreakMode:.
Предположим, что у нас есть UILabel около 5 строк и длинный текст, используя вышеописанный метод, я могу знать, будет ли это соответствовать или нет. Если это не подходит, я хотел бы добавить еще один UILabel с остальным текстом. Я делаю это, потому что макет представления смешан с изображением, и когда изображение заканчивается, я хотел бы иметь текст по всей ширине представления.
Я знаю, что с основным текстом я могу сделать это только в одном представлении, но я бы предпочел легко с UILabel.
/* IMAGE */##/* TEXT */
/* IMAGE */##/* TEXT */
/* IMAGE */##/* TEXT */
/* IMAGE */##/* TEXT */
/* IMAGE */##/* TEXT */
/* ** * *ТЕКСТ* ** * ** * ** * *** /
/
** * ***TEXT* ** * ** * ** * *** /
/
** * ***TEXT* ** * ** * ** * ****/
Как получить диапазон, в котором UILabel будет усекать текст

+0

Я не думаю, что в iOS встроена функциональность, которая уведомляет, когда текст выходит за пределы внутри UILabel. – rakeshNS

ответ

2

Ну я нашел решение ответ является дубликатом Get truncated text from UILabel
Я скопирую измененный метод из этого ответа, вам нужно импортировать структуру CoreText и убедиться, что метка установлена ​​на перенос слов:

- (NSArray *)truncate:(NSString *)text forLabel: (UILabel*) label 
{ 
    NSMutableArray *textChunks = [[NSMutableArray alloc] init]; 

    NSString *chunk = [[NSString alloc] init]; 
    NSMutableAttributedString *attrString = nil; 
    UIFont *uiFont = label.font; 
    CTFontRef ctFont = CTFontCreateWithName((__bridge CFStringRef)uiFont.fontName, uiFont.pointSize, NULL); 
    NSDictionary *attr = [NSDictionary dictionaryWithObject:(__bridge id)ctFont forKey:(id)kCTFontAttributeName]; 
    attrString = [[NSMutableAttributedString alloc] initWithString:text attributes:attr]; 
    CTFramesetterRef frameSetter; 


    CFRange fitRange; 
    while (attrString.length>0) { 

     frameSetter = CTFramesetterCreateWithAttributedString ((__bridge CFAttributedStringRef) attrString); 
     CTFramesetterSuggestFrameSizeWithConstraints(frameSetter, CFRangeMake(0,0), NULL, CGSizeMake(label.bounds.size.width, label.bounds.size.height), &fitRange); 
     CFRelease(frameSetter); 

     chunk = [[attrString attributedSubstringFromRange:NSMakeRange(0, fitRange.length)] string]; 

     [textChunks addObject:chunk]; 

     [attrString setAttributedString: [attrString attributedSubstringFromRange:NSMakeRange(fitRange.length, attrString.string.length-fitRange.length)]]; 

    } 
    return textChunks; 
} 
+1

FYI длина первой строки в массиве textChunks будет длиной диапазона усеченной строки. – Kevin

Смежные вопросы