Domanda Come determinare l'altezza di UIWebView in base al contenuto, all'interno di UITableView con altezza variabile?


Sto cercando di creare un UITableView con file di altezza variabile come spiegato nella risposta a questa domanda

Il mio problema è che ogni cella contiene a UIWebView con diversi contenuti (caricati staticamente) non riesco a capire come calcolare l'altezza corretta in base al contenuto. C'è un modo per fare questo? Ho provato cose del genere:

   (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
       WebViewCell *cell = (WebViewCell*)[self tableView:tableView cellForRowAtIndexPath:indexPath];
       [cell setNeedsLayout];
       [cell layoutIfNeeded];
       return cell.bounds.size.height;
    }

Le celle stesse sono caricate da un pennino, che è semplicemente un UITableViewCell contenente a UIWebView. (Andrebbe anche bene se le celle si aggiustassero al massimo del contenuto html, sebbene l'altezza variabile sarebbe più bella).


70
2018-04-13 19:58


origine


risposte:


Questo codice è probabilmente troppo lento per l'uso della vista tabella, ma fa il trucco. Non sembra che ci sia un'alternativa, dato che UIWebView non offre accesso diretto al DOM.

In un controller di visualizzazione viewDidLoad Carico del codice HTML in una webview e quando il caricamento è terminato, esegui qualche javascript per restituire l'altezza dell'elemento.

- (void)viewDidLoad
{
    [super viewDidLoad];
    webview.delegate = self;
    [webview loadHTMLString:@"<div id='foo' style='background: red'>The quick brown fox jumped over the lazy dog.</div>" baseURL:nil];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    NSString *output = [webview stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"foo\").offsetHeight;"];
    NSLog(@"height: %@", output);
}

77
2018-04-15 11:41



Sono stato molto contento di trovare le tue risposte, il trucco javascript ha funzionato bene per me.

Tuttavia, volevo dire che esiste anche il metodo "sizeThatFits:":

CGSize goodSize = [webView sizeThatFits:CGSizeMake(anyWidth,anyHeigth)];

Dobbiamo impostare una dimensione preferita diversa da zero, ma a parte questo, di solito funziona sempre!

Solitamente, poiché con UIWebViews, sembra che funzioni solo sul secondo caricamento (utilizzo il metodo "loadHTMLString:", e sì chiamo "sizeThatFits:" dal metodo delegato "didFinishLoad:").

Quindi, è per questo che sono stato molto felice di trovare la soluzione che funziona in ogni caso.


28
2018-06-06 13:09



Questo sembra funzionare. Per adesso.

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    CGFloat webViewHeight = 0.0f;
    if (self.subviews.count > 0) {
        UIView *scrollerView = [self.subviews objectAtIndex:0];
        if (scrollerView.subviews.count > 0) {
            UIView *webDocView = scrollerView.subviews.lastObject;
            if ([webDocView isKindOfClass:[NSClassFromString(@"UIWebDocumentView") class]])
                webViewHeight = webDocView.frame.size.height;
        }
    }
}

Dovrebbe restituire in modo sicuro 0 se fallisce.


6
2017-08-06 23:26



Il problema con -sizeThatFits: è che non funziona fuori dalla scatola, almeno non su iOS 4.1. Restituisce solo la dimensione corrente della visualizzazione Web (indipendentemente dal fatto che venga chiamata con CGSizeZero o una dimensione non zero arbitraria).

Ho scoperto che funziona davvero se si riduce l'altezza del frame di WebView prima di chiamare -sizeThatFits:.

Vedi la mia soluzione: Come determinare la dimensione del contenuto di un UIWebView?


4
2017-10-14 21:13



Se hai valori sbagliati con sizeThatFits la prima volta ma non dopo, ecco una possibile causa che ho riscontrato: un bug con CSS esterno. Sembra che webViewDidFinisLoad venga chiamato a breve, prima che i CSS esterni vengano recuperati e il documento Web sia completamente compilato. Penso che l'errore scompaia se ricarichi a causa della cache.

Un trucco: precarica il tuo CSS con un UIWebView fittizio nella tua applicazione.

SDK: IOS4


3
2017-08-09 12:31



misurare una webview funziona ma solo quando ha caricato il suo contenuto

  • fare una webview piccola (come 5px)
  • caricarlo e attendere la fine
  • chiamando sizeToFit su di esso allora
  • ottenere le dimensioni POI
  • ricarica la vista tabella (restituisci l'altezza corretta per la cella)

pubblicità:: D vedi la mia lezione M42WebviewTableViewCell su github che lotta con questo


3
2017-11-24 11:01



L'approccio migliore è da usare scrollView.contentSize.height proprietà, come sotto.

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
     NSLog(@"%f",webView.scrollView.contentSize.height);   
}

2
2017-08-29 23:43