2016-03-09 5 views
9

Sto lavorando a un'app che carica piccoli blocchi di codice HTML in diverse visualizzazioni Web. Voglio che questo HTML sia selezionabile dall'utente, in modo che possano copiare e incollare parti di esso. Funziona perfettamente, ma solo quando il contenuto è maggiore di 100px alto. Per qualche ragione, se è più breve, il contenuto non può essere selezionato dall'utente.UIWebView con altezza inferiore a 101px non selezionabile?

Procedura per riprodurre:

  1. Creare un UIWebView con una larghezza di 322 e un'altezza di 100 e aggiungerlo a una visione
  2. chiamata loadHTMLString: "W " * 64, baseURL: nil sul WebView. (Sul mio schermo è di 4 righe complete di s "W")
  3. Fare clic e tenere premuto uno dei "W", si noti che il menu di copia/incolla non si appaiono
  4. chiamata loadHTMLString: "W " * 65, baseURL: nil sulla WebView. (Sul mio schermo l'ultima "W" si trova al 5 ° fila)
  5. cliccare e tenere premuto su una delle "W", si noti che il menu di copia/incolla non appare

I' Ho provato un certo numero di cose, per capire cosa sta succedendo qui. Seguo la stessa procedura, ma inizia con un'altezza di 101 invece di 100, funziona perfettamente con solo 4 righe.

Penso che questo potrebbe essere un bug in iOS? Può essere?

Io corro iOS 9.2, con Xcode 7.2.1

C'è qualcuno qui sa perché questo potrebbe accadere, o se non v'è alcun tipo di lavoro intorno che posso usare per risolvere questo problema?

+0

è possibile replicare il bug sul dispositivo reale? i simulatori non funzionano sempre correttamente al 100%. – OlDor

+0

L'ho replicato su un dispositivo reale. Il problema persiste – BananaNeil

+0

Qualsiasi motivo per cui non è possibile impostare la visualizzazione Web su 101? –

risposta

3

Ho provato qualche soluzione alternativa, inutilmente.

L'unica soluzione che ho trovato: utilizzare WKWebView - non presenta questo problema.

Attualmente, a partire da iOS 9, non è possibile aggiungere WKWebView tramite Interface Builder. Questo perché non è supportato. Non sarà in grado di includerlo in IB, purché WKWebView intestazione dichiara come NS_UNAVAILABLE:

- (instancetype)initWithCoder:(NSCoder *)coder NS_UNAVAILABLE; 

Invece, si può dichiarare come una proprietà, e creare un'istanza nel vostro viewDidLoad implementazione, in questo modo:

self.webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 200, 320, 100)]; 
+0

Ho intenzione di andare avanti e segnare questo come la risposta giusta, perché funziona (il più delle volte). Non è stato un passaggio semplice da UIWebView a WKWebView, ma sembra che potrebbe essere la cosa giusta da fare. – BananaNeil

1

Bene, webview supponiamo di caricare il codice html, ma non la stringa pura, che potrebbe confonderlo. Se aggiungi <!DOCTYPE HTML> in primo piano, può essere selezionato indipendentemente dalla lunghezza della stringa.

+0

Questo in realtà non sembra essere vero. – BananaNeil

+0

L'ho provato, funziona per me. Lo scrivi così? 'loadHTMLString:" Che cosa vogliamo? ", baseURL: nil' – Terence

0

L'impostazione di scalesPageToFit su true per la visualizzazione Web sembra risolvere il problema ma solo se l'altezza è 100. Se il suo 99 o meno lo stesso problema persiste. Ma è strano vedere la relazione tra scalesPageToFit e questa caratteristica e per un'altezza di 100. Guardando le altezze di 101.100,99 sembra che si stia verificando una specie di problema di calcolo in virgola mobile. Sicuramente un bug.

Dopo ulteriori indagini, ho scoperto che se si imposta l'altezza su 100,5, il contenuto è selezionabile. Sembra una sorta di problema di arrotondamento nell'implementazione della visualizzazione web.

Quando ho guardato il contenuto della vista a scorrimento della vista del WebSize sembra che quando scrollview contentSize va oltre 100 la selezione funziona. Quindi se gestisci webviewDidFinishLoad e lì controlli se il contentSize è < 100 allora puoi ricaricare la stringa aggiungendo <br>. Finché meno di 100 continuerai a caricare aggiungendo un <br> ogni volta alla stringa caricata. Questo dovrebbe funzionare per te.

func webViewDidFinishLoad(webView: UIWebView) { 
    print(webview.scrollView.contentSize) 
    var content = webview.stringByEvaluatingJavaScriptFromString("document.body.innerHTML") 
    if content != nil && webview.scrollView.contentSize.height <= 100 { 
     content! += "<br>" 
     webview.loadHTMLString(content!, baseURL: nil) 
    } 
}