У меня есть решение этой проблемы, но я должен сказать, что я не большой поклонник этого. Это прекрасно работает, но решение на самом деле вызывает другую проблему. У меня есть исправление для вторичной проблемы, но это требует немного усилий.
Просто имейте в виду, что, поскольку OS3.2 или iOS4 (не знаю, какой именно) прямым подпредставлением UIWebView теперь является UIScrollView, а не UIScroller, поэтому мы можем сделать с ним гораздо больше. Кроме того, поскольку доступ к подпредставлениям представления не является частным действием, также не используется подпредставление, которое приводится как документированное представление, мы можем многое сделать с помощью UIWebView, не нарушая правил.
Сначала нам нужно получить UIScrollView из UIWebview:
UIScrollView *sview = [[webView subviews] objectAtIndex:0];
Теперь нам нужно изменить делегата этого scrollview, чтобы мы могли переопределить вызовы делегата scrollview (что может фактически стать причиной вторичной ошибки в результате этого решения, о котором я расскажу чуть позже):
sview.delegate = self;
Теперь, если вы попробуете в этот момент, масштабирование будет нарушено. Нам нужно реализовать метод UIScrollViewDelegate, чтобы исправить это. добавить:
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
UIView *webBrowserView = [[scrollView subviews] objectAtIndex:10];
return webBrowserView;
}
webBrowserView на самом деле является UIWebBrowserView, но это не документированный класс, поэтому мы просто будем рассматривать его как UIView.
Теперь запустите ваше приложение, увеличьте, а затем уменьшите масштаб веб-страницы. Поверните, и оно должно появиться правильно.
Это вызывает довольно большую ошибку, которая, возможно, хуже оригинала.
Если вы увеличите, а затем поверните, вы потеряете способность к прокрутке, но ваше изображение будет увеличено. Вот исправление, чтобы завершить все это.
Во-первых, нам нужно отследить несколько цифр и определить флаг:
Я определил их в моем файле h:
BOOL updateZoomData;
float zoomData; //this holds the scale at which we are zoomed in, scrollView.zoomScale
CGPoint zoomOffset; //this holds the scrollView.contentOffset
CGSize zoomContentSize; //this holds the scrollView.contentSize
Вы можете подумать, что можете просто получить эти числа из UIScrollView, но когда они вам понадобятся, они будут изменены, поэтому нам нужно, чтобы они хранились в другом месте.
Нам нужно использовать другой метод делегата:
- (void)scrollViewDidZoom:(UIScrollView *)scrollView{
if(updateZoomData){
zoomData = scrollView.zoomScale;
zoomOffset = scrollView.contentOffset;
zoomContentSize = scrollView.contentSize;
}
}
Теперь я чувствую беспорядок.
Нам нужно отслеживать вращение, поэтому вам нужно добавить это в ваш viewDidLoad, loadView или любой другой метод, который вы используете для регистрации уведомлений:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(webViewOrientationChanged:)
name:UIDeviceOrientationDidChangeNotification
object:nil];
и создайте этот метод:
- (void)webViewOrientationChanged:(NSNotification *)notification{
updateZoomData = NO;
[self performSelector:@selector(adjustWithZoomData) withObject:nil afterDelay:0.0];
}
Так что теперь каждый раз, когда вы поворачиваете, будет вызываться webViewOrientationChange. Причина выполнения executeSelector на 0,0 секунды заключается в том, что мы хотим вызвать AdjustWithZoomData при следующем цикле выполнения. Если вы вызываете его напрямую, AdjustWithZoomData откорректирует предыдущую ориентацию.
Вот метод AdjustWithZoomData:
- (void)adjustWithZoomData{
UIScrollView *sview = [[webView subviews] objectAtIndex:0];
[sview setZoomScale:zoomData animated:YES];
[sview setContentOffset:zoomOffset animated:YES];
[sview setContentSize:zoomContentSize];
updateZoomData = YES;
}
Вот и все! Теперь при повороте он будет поддерживать масштабирование и примерно поддерживать правильное смещение. Если кто-то хочет сделать математику о том, как получить точное правильное смещение, тогда сделайте это!