sizeWithFont не дает корректную высоту для UITextView, если существует длинная строка в обертываемом тексте

Есть ли способ получить корректный размер использования NSString:

- (CGSize)sizeWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode

это не становится отброшенным 2 или 3 сотнями символьных строк. В данный момент, если я пытаюсь использовать этот метод на этих длинных строках, он неправильно вычисляет их, и я заканчиваю с большим количеством пробела у основания UITextView.

Я попытался использовать UILineBreakModeWordWrap и UILineBreakModeCharacterWrap.

в изменении размеров выполняют

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    CGFloat     result = 44.0f;
    NSString*   text = nil;
    CGFloat     width = 0;
    CGFloat     tableViewWidth;
    CGRect      bounds = [UIScreen mainScreen].bounds;

    tableViewWidth = bounds.size.width;


    width = tableViewWidth - 150;       

    text = stringWithLongWords;

    if (text) {
        CGSize      textSize = { width, 20000.0f };     
        CGSize      size = [text sizeWithFont:[UIFont systemFontOfSize:10.0f] constrainedToSize:textSize lineBreakMode:UILineBreakModeWordWrap];

        size.height += 50.0f;               
        result = MAX(size.height, 44.0f+30.0f); 
    }

    return result;
}
15
задан 25 February 2010 в 04:00
поделиться

2 ответа

Вы сказали, что у вас есть UITableView с разной высотой. Вы установили одинаковый идентификатор повторного использования для всех ячеек? Возможно, старые ячейки с уже установленной высотой используются повторно. Если это проблема, вам следует снова изменить размер ячейки при ее повторном использовании.

1
ответ дан 1 December 2019 в 01:45
поделиться

UITextView не совсем похож на UILabel, обернутый в UIScrollView. Он имеет межстрочный интервал, отличный от размера шрифта, и поля, которые sizeWithFont:constrainedToSize:linkBreakMode: не учитывает.

Зная размер шрифта, вы можете рассчитать количество строк и учесть межстрочный интервал. Вы можете догадаться о полях и попытаться обмануть sizeWithFont:, чтобы получить более полезный ответ.

Популярными решениями, похоже, являются:

  • просто использовать UILabel, если вам не нужна функциональность UITextView

  • если вам нужны гиперссылки, наложите UIButton, которые выглядят как гиперссылки, на UILabel

  • используйте внеэкранный UITextView и его sizeToFit метод, чтобы получить реальный ответ

Мне не повезло с 3-м вариантом, но, похоже, он должен работать, так что, возможно, я сделал что-то не так.

Я собираюсь попробовать использовать UILabel и наложить кнопки для гиперссылок. Посмотрим, что из этого получится.

Если не получится, всегда есть вариант, который использовал Лорен Брихтер (известный по Tweetie): нарисовать все в UIView самостоятельно, используя CoreGraphics.

Удачи!

21
ответ дан 1 December 2019 в 01:45
поделиться