Ho una soluzione a questo problema, ma devo dire che non ne sono un grande fan. Funziona alla grande, ma la soluzione causa effettivamente un altro problema. Ho una soluzione per il problema secondario, ma ci vuole un po 'di sforzo.
Basta tenere presente che dal momento che OS3.2 o iOS4 (non sono sicuro quale) subview diretto di UIWebView è ora UIScrollView invece di UIScroller, quindi possiamo fare molto di più con esso. Inoltre, poiché l'accesso alle sottoview di una vista non è un'azione privata, né l'utilizzo di una visualizzazione secondaria che viene castata come vista documentata, possiamo fare molto con UIWebView senza infrangere le regole.
In primo luogo abbiamo bisogno di ottenere l'UIScrollView dal UIWebView:
UIScrollView *sview = [[webView subviews] objectAtIndex:0];
Ora abbiamo bisogno di cambiare il delegato di questa ScrollView in modo che possiamo ignorare le chiamate ScrollView delegato (che potrebbe in realtà essere la causa di un bug secondaria a seguito di questa soluzione, che ho intenzione di condividere in un attimo):
sview.delegate = self;
Ora, se si prova a questo punto, lo zoom è rotto. Abbiamo bisogno di implementare un metodo UIScrollViewDelegate per risolverlo. aggiungere:
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
UIView *webBrowserView = [[scrollView subviews] objectAtIndex:10];
return webBrowserView;
}
webBrowserView è in realtà un UIWebBrowserView, ma che non è una classe documentata, quindi stiamo solo andando a trattarlo come un UIView.
Ora esegui l'app, ingrandisci e rimpicciolisci la pagina web. Ruota e dovrebbe apparire correttamente.
Ciò provoca un bug piuttosto grande, che è forse peggiore dell'originale.
Se si ingrandisce e quindi si ruota, si perderà la capacità di scorrimento, ma la vista verrà ingrandita. Ecco la correzione Per completare il tutto.
In primo luogo, abbiamo bisogno di tenere traccia di alcuni numeri, e hanno una bandiera definito:
ho questi definito nel mio h di file:
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
Si può pensare si può semplicemente prendere questi numeri da UIScrollView, ma quando ne hai bisogno, saranno cambiati, quindi abbiamo bisogno di loro memorizzati altrove.
Abbiamo bisogno di utilizzare un altro metodo delegato:
- (void)scrollViewDidZoom:(UIScrollView *)scrollView{
if(updateZoomData){
zoomData = scrollView.zoomScale;
zoomOffset = scrollView.contentOffset;
zoomContentSize = scrollView.contentSize;
}
}
Ora si ottiene in un pasticcio mi sento.
Abbiamo bisogno di tenere traccia di rotazione, quindi avrai bisogno di aggiungere questo alla vostra viewDidLoad, loadview, o qualsiasi metodo utilizzato per registrare le notifiche:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(webViewOrientationChanged:)
name:UIDeviceOrientationDidChangeNotification
object:nil];
e creare questo metodo:
- (void)webViewOrientationChanged:(NSNotification *)notification{
updateZoomData = NO;
[self performSelector:@selector(adjustWithZoomData) withObject:nil afterDelay:0.0];
}
Così ora ogni volta che si ruota webViewOrientationChange verrà chiamato. La ragione per cui performSelector è in ritardo per 0,0 secondi è perché vogliamo chiamare adjustWithZoomData sul prossimo runloop. Se lo chiamate direttamente, adjustWithZoomData si regolerà per l'orientamento precedente.
Ecco il metodo adjustWithZoomData:
- (void)adjustWithZoomData{
UIScrollView *sview = [[webView subviews] objectAtIndex:0];
[sview setZoomScale:zoomData animated:YES];
[sview setContentOffset:zoomOffset animated:YES];
[sview setContentSize:zoomContentSize];
updateZoomData = YES;
}
questo è tutto! Ora quando lo ruotate manterrà lo zoom e manterrà approssimativamente l'offset corretto. Se qualcuno vuole fare i conti su come ottenere l'esatto offset corretto, fallo!
Grazie per la soluzione! Ho corretto il codice in modo che sia più facile per chiunque implementare nel proprio ViewController.m (il codice è anche duplicato in https://gist.github.com/834907) – choonkeat
Fa ancora alcune cose strane con l'animazione, ma grazie;) È meglio di prima! Mi chiedo esattamente cosa fa Apple per soddisfare questo ... io penso che abbiano una sorta di classe non documentata che fornisce una soluzione. – PostCodeism
Grazie - un po 'nervoso, ma migliore di prima. – daidai