2016-05-25 8 views
0

Das Problem ist, dass ich eine Tabellenansicht mit mehreren Zellen habe und ein WebView in einer dieser Zellen habe. Wenn ich den Scroll in der Webansicht deaktiviere, sollte ich eine statische Web-Inhaltsansicht haben, die in der tableView scrollt, nicht für sich selbst, was alles gut funktioniert. Im webViewDidFinishLoad Methode I rufenUIWebView "document.height" Auswertung gibt falsche Höhe auf älteren iPhones zurück (speziell 4s und 5)

[[webView stringByEvaluatingJavaScriptFromString: @"document.height"] floatValue];

dann diesen Wert in heightForRowAtIndexPath eingestellt, indem der Tisch Nachladen. Alles funktioniert gut auf iPhone 6 und höher, aber auf 4s und 5, ist der Boden meiner Web-Inhalte abgeschnitten. Der zurückgegebene Höhenunterschied ist völlig zufällig, wobei 724 Pixelhöhe nicht geclippt und in Ordnung ist, bei anderen Inhalten mit nahezu derselben zurückgegebenen Pixelhöhe, die um mehr als 30% des Originals abgeschnitten ist.

Ich versuchte mehrere Ansätze, die ich hier fand, aber keiner von ihnen arbeitete. Versucht, den Maximalwert aus der Auswertung der Offsethöhe, Scrollhöhe und anderer Eigenschaften zu erhalten, aber auch ohne Erfolg. Auch versucht, jquery Befehle auf meinem Webview laufen, aber noch einmal, ohne Erfolg bisher. Wenn jemand Erfahrung mit einem Problem wie diesem hat, bitte helfen Sie. Der vollständige Code-Schnipsel, wobei "articleViewHeight" ist eine Einschränkung für die webView erwähnt:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    return [self getCellHeight:indexPath.row]; 
} 

-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    return [self getCellHeight:indexPath.row]; 
} 

-(CGFloat)getCellHeight:(NSInteger)row{ 
switch (row) { 
    case 0: 
     return self.view.frame.size.height * 0.1f; 
     break; 
    case 1: 
     return self.view.frame.size.height * 0.375f; 
     break; 
    case 2: 
     return UITableViewAutomaticDimension;//self.view.frame.size.height * 0.15f; 
     break; 
    case 3: 
     return self.articleViewHeight; 
     break; 
    case 4: 
     return self.view.frame.size.height * 0.2f; 
     break; 
    default: 
     return UITableViewAutomaticDimension; 
     break; 
    } 
} 

- (void)webViewDidFinishLoad:(UIWebView * _Nonnull)webView{ 

    CGFloat height = [self getWebViewPageHeight]; 

    self.articleViewHeight = height; 

    [self.tableView reloadData]; 
    [self removeLoader]; 
} 

- (CGFloat) getWebViewPageHeight { 
    CGFloat height1 = [[self.articleView stringByEvaluatingJavaScriptFromString: @"document.height"] floatValue]; 
    CGFloat height2 = [[self.articleView stringByEvaluatingJavaScriptFromString: @"document.body.scrollHeight"] floatValue]; 

return MAX(height1, height2); 
} 

Update: die htmlstring Ladecode als

-(void)doneLoading{ 
    NSString *pathToFile =[[NSBundle mainBundle] pathForResource:@"news" ofType:@"css"]; 
    NSString *fileString = [NSString stringWithContentsOfFile:pathToFile encoding:NSUTF8StringEncoding error:nil]; 
    NSString* headerString = @"<!DOCTYPE html><html><head title='test'><style type=\"text/css\" media=\"all\">%@</style></head><body><div id='content'>%@</div></body></html>"; 

    NSString * theString = [NSString stringWithFormat:headerString,fileString,self.htmlString]; 
    [self.articleView loadHTMLString:theString baseURL:nil]; 
} 
+0

Ein umfangreicher Codeausschnitt wäre hilfreich, um Benutzern das Problem besser verständlich zu machen. – blundin

+0

Ist die Sache, die Sie in einen Webview lokalen HTML-Inhalt laden oder tatsächliche, Online-Seite? – Kegluneq

+0

Seine lokale, eine HTML-Zeichenfolge. – Netheril

Antwort

0

angefordert Diese Lösung funktioniert nur für lokale HTML-String, Sie können frei ändern (naja, Sie könnten Webseite separat in eine Zeichenfolge herunterladen und injizieren, aber dann bekommen Sie eine Last von anderen Problemen.

Ich hatte ähnliches Problem und fand folgende Methode, um sie zu lösen. Fügen Sie dieses Skript zuerst in das <head> Tag Ihres HTML hinzu.

<script type="text/javascript"> 
    window.onload = function(){ 
     window.location.href = "height://"+document.getElementById("content").offsetHeight; 
    } 
</script> 

Dies ist notwendig, weil, wenn - (void)webViewDidFinishLoad:(UIWebView *)webView; noch den Inhalt aufgerufen wird, nicht richtige Höhe hat. Fügen Sie auch Ihren gesamten HTML-Inhalt in ein div mit ID aus dem Skript ein ("content" in diesem Beispiel).

... html header 
<body> 
    <div id="content"> 
     ... your content 
    </div> 
</body> 

Dann ändern Sie Ihre - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; Methode.

-(BOOL)webView:(UIWebView*)pWebView shouldStartLoadWithRequest:(NSURLRequest*)pRequest navigationType:(UIWebViewNavigationType)pNavigationType{ 
    NSURL* url = pRequest.URL; 
    if(pNavigationType==UIWebViewNavigationTypeLinkClicked){ 
     return ![[UIApplication sharedApplication] openURL:url]; 
     // or do whatever you do with normal links 
    } else if([url.scheme isEqualToString:@"height"]){ 
     CGFloat contentHeight = [url.host floatValue]; 
     // do your thing with height 
    } 
} 

Und Viola! Das hat es für mich gemacht. Jeder Höhenfehler war so geringfügig, dass das Hinzufügen von kleinen (2px) zusätzlichen Unterfüllungen für Inhalte in CSS meinen Inhalt vollständig zeigte.

EDIT:

ich wichtige Sache in meinem Code nur bemerkt. Die Webansicht hat .scaleToPage Flag auf NO gesetzt und noch wichtiger: Anfangshöhe von Webview. Es ist auf 6k eingestellt. Wenn ich es auf 0 ändere, wird der Inhalt nach dem Laden abgeschnitten.

Um die richtige Höhe zu erhalten, muss die Anfangshöhe von wevbiew während des Ladevorgangs groß genug sein, um den gesamten HTML-Inhalt ohne Scrollen zu speichern.

Da Sie Ihre Webansicht in einer Zelle haben, wird dies Ihnen nicht helfen. Vielleicht legen Sie ein anderes, verstecktes und großes Webview auf die Unterseite des Zeichnungsstapels, mit der gleichen Breite wie das in der Zelle und laden Sie zuerst dort, kommen Sie in die Höhe und laden Sie dann das eine in eine Zelle.

+0

Nun, hat nicht funktioniert für mich, das gibt den gleichen Wert wie "document.body.offsetheight" von meinem "getWebViewPageHeight", die ich bereits entfernt, weil es immer kleiner als document.height war ... – Netheril

-1

Ich hatte eine Anforderung, web view in scrollview zu haben.

Die Art, wie ich behandelt, ohne jeden Hack getestet. Tatsächlich wird diese Delegate-Methode mehrmals in einer einzelnen Anforderung aufgerufen. Ihre webViewDidFinishLoad muss wie unten sein:

Es gibt einen Delegaten - (void)webViewDidFinishLoad:(UIWebView *)webView

I Webansicht Höhe berechnen: -

- (void)webViewDidFinishLoad:(UIWebView *)webView{ 
if (webView.isLoading == NO)// as it is called multiple times so wait untill last call 
      { 
       NSDictionary* userInfo = @{@"webView": webView}; 
       [[NSNotificationCenter defaultCenter] postNotificationName:WEB_VIEW_FINISH_LOAD object:nil userInfo:userInfo];//sending to compute content size for any view which is using this class 
      } 
      [self hideActivityOverlayAnimation:NO]; 
    } 

Dies ist, wie ich Webansicht Höhe berechnet haben:

-(void)webViewFinishedLoad:(NSNotification*)notification{ 

if ([notification.name isEqualToString:WEB_VIEW_FINISH_LOAD]) 
{ 
    NSDictionary* userInfo = notification.userInfo; 
    UIWebView* webView = (UIWebView*)userInfo[@"webView"]; 

    [webView.scrollView setScrollEnabled:NO];// it was my requirement, dont have to do any thing with height calculation 
    CGFloat **height** = [[webView stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue];//every time it returnes different 

} 

} 

Sie können diese Höhe verwenden, um die Größe Ihrer Zelle zu ändern.

Der Hauptteil, der mich verwirrt war oben. Meine Einrichtung Methode der Web-Ansicht:

self.webView = [[UIWebView alloc] initWithFrame:webViewFrame]; 
    [self.webView setDelegate:self]; 
    self.webView.scalesPageToFit = YES; 
    self.webView.contentMode = UIViewContentModeScaleAspectFit; 
    [self.view addSubview:self.webView]; 

Ich hoffe, es wird Ihnen helfen !!!

+0

Traurig, Dies war nicht die Lösung, meinerseits das dedfinishload nur einmal aufgerufen, und die .isLoading ist Netheril

+0

können Sie mehr Code zeigen, wie Sie lokale Zeichenfolge in der Webansicht laden – Alok

+0

Während ich die Mühe zu schätzen, die Zuweisung der Webview-Objekt buchen wird überhaupt nicht helfen. – Netheril