У меня есть другое решение, которое отлично работает.
С одной стороны, подход и решение 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 (его свойство 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
вычисляется с помощью трюка описано выше ...