2016-03-09 6 views
9

Pracuję nad aplikacją, która ładuje małe porcje kodu HTML do kilku odsłon. Chcę, aby ten HTML był możliwy do wyboru przez użytkownika, aby mógł on kopiować i wklejać jego fragmenty. Działa to zupełnie dobrze, ale gdy zawartość jest większa niż , wysokość jest większa niż .. Z jakiegoś powodu, jeśli jest krótszy, użytkownik nie może wybrać treści.UIWebView o wysokości mniejszej niż 101 pikseli nie można wybrać?

Kroki do odtworzenia:

  1. Tworzenie UIWebView o szerokości 322 i wysokości 100 i dodać go do widoku
  2. połączeń loadHTMLString: "W " * 64, baseURL: nil na WebView. (Na ekranie jest 4 kompletne wierszy „W” S)
  3. kliknąć i przytrzymać jeden z przycisków „W”, trzeba pamiętać, że w menu kopiuj/wklej nie pojawiają
  4. połączenia loadHTMLString: "W " * 65, baseURL: nil na przeglądarka internetowa. (Na ekranie ostatni „W” jest na 5. rzędu)
  5. Kliknij i przytrzymaj jeden z przycisków „W”, trzeba pamiętać, że w menu kopiuj/wklej ma pojawiają

I próbowałem wielu rzeczy, aby zrozumieć, co się tutaj dzieje. Podążam tymi samymi krokami, ale zacznij od wysokości 101 zamiast 100, działa idealnie, mając tylko 4 rzędy.

Myślę, że to może być błąd w iOS? Może?

biegnę iOS 9.2, z Xcode 7.2.1

Czy ktoś tu wie, dlaczego to może się zdarzyć, czy istnieje jakikolwiek rodzaj pracy wokół, że mogę używać, aby to naprawić?

+0

Czy można replikować błąd na rzeczywistym urządzeniu? symulatory nie zawsze działają poprawnie w 100%. – OlDor

+0

Powieliłem to na rzeczywistym urządzeniu. Problem utrzymuje się. – BananaNeil

+0

Jakiś powód, dla którego nie można ustawić widoku internetowego na 101? –

Odpowiedz

3

Próbowałem kilku obejść, bezskutecznie.

Jedyne obejście, które znalazłem: użyj WKWebView - nie ma tego problemu.

Obecnie, począwszy od iOS 9, nie można dodać WKWebView za pomocą Konstruktora interfejsu. Jest tak, ponieważ nie jest obsługiwane. Nie będzie w stanie umieścić go w IB, jak długo WKWebView nagłówka deklaruje ją jako NS_UNAVAILABLE:

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

Zamiast tego, można zadeklarować ją jako własność i oznacz ją w implementacji viewDidLoad, tak jak poniżej:

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

Zamierzam iść dalej i oznaczyć to jako właściwą odpowiedź, ponieważ działa (przez większość czasu). Nie było to całkiem łatwe przejście z UIWebView do WKWebView, ale wydaje się, że może to być słuszne. – BananaNeil

1

Cóż, przeglądanie stron internetowych zakłada załadowanie kodu html, ale nie czysty ciąg, który mógłby go pomylić. Jeśli dodasz przed sobą <!DOCTYPE HTML>, można go wybrać niezależnie od tego, jak krótki jest ciąg.

+0

To nie wydaje się być prawdą. – BananaNeil

+0

Próbowałem, to działa dla mnie. Czy piszesz to tak? 'loadHTMLString:" Co kiedykolwiek chcesz ", baseURL: zero" – Terence

0

Ustawienie scalesPageToFit na true dla widoku internetowego wydaje się rozwiązywać problem, ale tylko wtedy, gdy wysokość wynosi 100. Jeśli jego 99 lub mniej, to ten sam problem utrzymuje się. Ale to dziwne, aby zobaczyć relację między scalesPageToFit a tą cechą i dla wysokości 100. Patrząc na wysokość 101,100,99, wydaje się, że dzieje się tu jakiś rodzaj obliczeń zmiennoprzecinkowych. Zdecydowanie błąd.

Po dokładniejszym zbadaniu okazało się, że jeśli ustawisz wysokość na 100,5, zawartość będzie można wybrać. Wydaje się, że jest to jakiś problem zaokrąglania w implementacji widoku WWW.

Kiedy przyjrzałem się zawartości widoku przewinięcia w widoku sieciowym, wygląda na to, że gdy zawartość przewijania contentSize przekracza 100, wybór działa. Więc jeśli obsłużysz webviewDidFinishLoad i tam sprawdzisz, czy contentSize jest < 100, to możesz przeładować ciąg przez dodanie <br>. Tak długo jak jego mniej niż 100 nadal ładujesz, dodając za każdym razem <br> do załadowanego łańcucha. To powinno działać dla ciebie.

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) 
    } 
} 
Powiązane problemy