У меня есть решение этой проблемы, но я должен сказать, что я не большой поклонник этого. Он отлично работает, но решение на самом деле вызывает еще одну проблему. У меня есть исправление для вторичной проблемы, но это требует больших усилий.
Просто имейте в виду, что с OS3.2 или iOS4 (не уверен, какой) UUWebView прямое подчинение теперь 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.
Теперь запустите приложение, увеличьте масштаб, а затем уменьшите масштаб веб-страницы. Поверните, и он должен выглядеть правильно.
Это вызывает довольно большую ошибку, возможно, хуже оригинала.
Если вы увеличиваете масштаб и затем вращаетесь, вы потеряете способность прокрутки, но ваш вид будет увеличен. Вот исправление Чтобы завершить все это.
Во-первых, мы должны следить за несколько номеров, и иметь флаг, определенный:
Я это определено в моей час файла:
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. Причина, по которой функция Selectlect задерживается на 0,0 секунды, заключается в том, что мы хотим вызвать adjustWithZoomData на следующей runloop. Если вы вызываете это напрямую, настройкаWithZoomData будет корректироваться для предыдущей ориентации.
Вот метод adjustWithZoomData:
- (void)adjustWithZoomData{
UIScrollView *sview = [[webView subviews] objectAtIndex:0];
[sview setZoomScale:zoomData animated:YES];
[sview setContentOffset:zoomOffset animated:YES];
[sview setContentSize:zoomContentSize];
updateZoomData = YES;
}
Вот это! Теперь, когда вы вращаетесь, он будет поддерживать масштабирование и примерно поддерживать правильное смещение. Если кто-то хочет сделать математику о том, как получить точное правильное смещение, тогда идите!
Спасибо за решение! Я исправил код, так что для кого-то проще реализовать его в ViewController.m (код также дублируется на https://gist.github.com/834907) – choonkeat
Он по-прежнему делает некоторые странные вещи с анимацией, но спасибо;) Это лучше, чем было раньше! Интересно, что именно делает Apple для этого ... я думаю, что у них есть какой-то недокументированный класс, который дает исправление. – PostCodeism
Спасибо, бит, но лучше, чем раньше. – daidai