У меня есть другое решение, которое прекрасно работает.
С одной стороны, подход и решение Ortwin работает только с iOS 6.0 и более поздними версиями, но не работает корректно на iOS 5.0, 5.1 и 5.1.1 и нас другой стороны, есть кое-что, что мне не нравится и не может понять с помощью подхода Ортвина, это использование метода [webView sizeThatFits:CGSizeZero]
с параметром CGSizeZero
: если вы читаете официальную документацию Apple об этих методах и их параметре,в нем четко сказано:
Реализация этого метода по умолчанию возвращает размерную часть прямоугольника границ вида.Подклассы могут переопределить этот метод, чтобы возвращать пользовательское значение, основанное на желаемой компоновке любых подпредставлений.Например, объект UISwitch возвращает значение фиксированного размера, которое представляет стандартный размер представления переключателя, а объект UIImageView возвращает размер изображения, которое он отображает в данный момент.
Я имею в виду, чтоПохоже, он наткнулся на свое решение без какой-либо логики, потому что, читая документацию, параметр, переданный в [webView sizeThatFits: ...]
, должен, по крайней мере, иметь желаемый width
.С его решением желаемая ширина устанавливается в кадр webView
перед вызовом sizeThatFits
с параметром CGSizeZero
.Поэтому я утверждаю, что это решение работает на iOS 6 «случайно».
Я представил более рациональный подход, который имеет преимущество работы на iOS 5.0 и более поздних версиях ... А также в сложных ситуациях, когда более чемодин веб-вид (со свойством webView.scrollView.scrollEnabled = NO
, встроенным в scrollView
.
. Вот мой код, чтобы принудительно настроить макет webView
на желаемый width
и получить соответствующий набор height
обратно к самому webView
:
Obj-C
- (void)webViewDidFinishLoad:(UIWebView *)aWebView
{
aWebView.scrollView.scrollEnabled = NO; // Property available in iOS 5.0 and later
CGRect frame = aWebView.frame;
frame.size.width = 200; // Your desired width here.
frame.size.height = 1; // Set the height to a small one.
aWebView.frame = frame; // Set webView's Frame, forcing the Layout of its embedded scrollView with current Frame's constraints (Width set above).
frame.size.height = aWebView.scrollView.contentSize.height; // Get the corresponding height from the webView's embedded scrollView.
aWebView.frame = frame; // Set the scrollView contentHeight back to the frame itself.
}
Swift 4.x
func webViewDidFinishLoad(_ aWebView: UIWebView) {
aWebView.scrollView.isScrollEnabled = false
var frame = aWebView.frame
frame.size.width = 200
frame.size.height = 1
aWebView.frame = frame
frame.size.height = aWebView.scrollView.contentSize.height
aWebView.frame = frame;
}
Обратите внимание, что в моем примере webView
был встроен в пользовательский scrollView
с другим webViews
... Все эти webViews
имели свои webView.scrollView.scrollEnabled = NO
, и последний фрагмент кода, который я должен был добавить, былвычисление height
из contentSize
моего обычая scrollView
с вложением этих webViews
, но это было так же просто, как суммирование моих webView
* frame.size.height
, вычисленных с помощью трюка, описанного выше ...