Я использую UITextView для отображения NSAttributedString из некоторого заданного HTML, который может включать такие элементы, как жирный шрифт, курсив, списки, пометки, надстрочный и нижний индекс и т. д.
В настоящее время приведенный ниже код работает довольно хорошо только для абзацев текста, но как только я начну добавлять более сложные элементы, такие как списки и разрывы строк, размеры полностью исчезнут.
// Create the NSMutableAttributedString from given HTML
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *options = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)};
NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithData:data options:options
documentAttributes:nil error:nil];
// Max size for the text container (no limit on height)
CGSize bounds = CGSizeMake(320.0, CGFLOAT_MAX);
// Set the font and size for better rendering results
UIFont *font = [UIFont fontWithName:@"Roboto" size:14.0];
NSDictionary *attrFont = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
NSRange range = NSMakeRange(0, str.length);
[str addAttributes:attrFont range:range];
// Calcualte the size of the UITextView based on the above parameters
CGRect rect = [str boundingRectWithSize:bounds options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading| NSStringDrawingUsesDeviceMetrics context:nil];
Я немного поискал и нашел эту ветку, но после того, как я попробовал то, что там предлагается, она все еще не работает, интересно, знает ли кто-нибудь лучший способ сделать это?
Хорошо, после долгих возни я обнаружил, что размеры на самом деле правильные, но у UITextView
есть некоторые отступы / вставки, которые вызывают переполнение. Установка следующего в textView устранила проблему
[self.textView setTextContainerInset:UIEdgeInsetsZero];
self.textView.textContainer.lineFragmentPadding = 0;
@rmaddy на первый взгляд он был полностью выключен (отрезал целые строки), но я могу обновить формулировку.
@rmaddy как бы вы рассчитали со вставками?
Добавьте вставки текстового представления к вычисляемому rect
.
Существует большая разница между "размер полностью сбился" и тем, что он немного отключен из-за небольших вставок текстового представления. Кстати, другое решение - настроить рассчитанный размер текста с помощью вставок текстового представления.