Динамическое изменение размера UIWebView в зависимости от размера шрифта содержимого - PullRequest
7 голосов
/ 27 августа 2010

У меня есть текст, который должен отображаться в моем приложении. Текст содержит ссылки, которые должны быть интерактивными. Я пробовал несколько решений для создания вставляемых ссылок в UITextViews и UILabels.

  1. UITextView ссылки

    • UITextView предоставляет детекторы данных, которые распознают URL-адреса и делают их доступными.
    • Не подходит для меня, потому что ссылка открывается только в Safari, нет способа взять контроль над собой и делать со мной то, что я хочу.
  2. UILabel ссылок с использованием «Необычных ярлыков» (http://furbo.org/2008/10/07/fancy-uilabels/)

    • Почти идеальное решение, обеспечивающее обнаружение ссылок и возможность для пользователя видеть их и постукивать по ним, и дает мне полный контроль над тем, что делать со ссылкой, когда она нажата.
    • В настоящее время неприменимо, потому что реализация использует UIButton s для наложения ссылок, и они не переносят текст на длинные ссылки.

Наконец-то я остановился на использовании веб-просмотра. Я передаю текст в веб-просмотр и создаю вокруг него базовую HTML-оболочку, и все становится просто так. Это тот же подход, который использует Twitter для iPhone (он же Tweetie).

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

В отличие от Tweetie, у меня есть больше контента под веб-обзором, и я хочу избежать переполнения прокрутки или потраченного впустую пространства. В любом случае веб-представление является подпредставлением прокрутки, поэтому содержимое всей страницы может увеличиваться без необходимости прокрутки ее подпредставлений.

Можно ли каким-либо образом динамически изменить размер веб-просмотра, чтобы оно соответствовало нужной высоте в зависимости от его содержимого?

До сих пор я много чего пробовал, похоже, что нет надежного решения:

  • sizeToFit ничего не делает (или, скорее, просто устанавливает размер, равный текущему кадру в любом случае).
  • sizeThatFits: возвращает его текущий размер в любом случае.
  • NSString sizeWithFont:constrainedToSize: неосуществимо, потому что UIWebView и UIFont имеют разные представления о размере 18.
    • Просто чтобы уточнить этот момент. В моем тестировании я обнаружил, что webView с scaleFactor 1.0 и scalesPageToFit, установленным на NO и размером шрифта для всей страницы, установленным на 13.5pt (в CSS), отображает текст, который имеет такой же размер, что и UILabel с размером UIFont размера 18. Если кто-нибудь сможет мне это объяснить, я буду благодарен.
  • Кроме того, в webView я использую свойство CSS word-wrap: break-word;, чтобы предотвратить горизонтальную прокрутку webView с длинными словами или URL-адресами. Из-за этого поведение оборачивания между webView и UILineBreakModeWordWrap полностью отличается. Даже использование UILineBreakModeCharacterWrap не дает таких же результатов.

Либо нет способа сделать это, либо я тупой и упускаю что-то простое. Если бы кто-нибудь мог дать какое-то понимание, я был бы очень благодарен. Спасибо.

Ответы [ 2 ]

3 голосов
/ 03 декабря 2010

На самом деле, вы можете использовать -sizeThatFits: с небольшой хитростью.См. мой ответ на аналогичный вопрос.

2 голосов
/ 27 августа 2010

Я нашел решение своей проблемы на http://www.iphonedevsdk.com/forum/iphone-sdk-development/1388-getting-actual-content-size-uiwebview.html

Я не уверен, что это лучшее решение, но оно работает.Если у кого-то есть идеи получше, я буду рад их услышать.

Я запустил этот javascript в своем веб-представлении в webViewDidFinishLoad:.У меня есть один элемент div, обертывающий мой контент, который называется body, поэтому мой код выглядит следующим образом:

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    NSString *string = [_webView stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"body\").offsetHeight;"];
    CGFloat height = [string floatValue] + 8;
    CGRect frame = [_webView frame];
    frame.size.height = height;
    [_webView setFrame:frame];

    if ([[self delegate] respondsToSelector:@selector(webViewController:webViewDidResize:)])
    {
        [[self delegate] webViewController:self webViewDidResize:frame.size];
    }
}

Мне пришлось немного дополнить высоту, поскольку исходное значение не учитывало размеры полей и т. Д.

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

...