2016-03-09 7 views
9

私はいくつかのwebviewsにHTMLの小さな塊をロードするアプリに取り組んでいます。このHTMLをユーザーが選択できるようにして、その部分をコピーして貼り付けることができます。これは完全に正常に動作しているが、のみコンテンツは、背の高い100pxよりも大きい場合。なんらかの理由で、それがより短い場合、そのコンテンツはユーザによって選択することができない。高さが101px未満のUIWebViewは選択できませんか?

再現する手順:

  1. を322の幅、及び100の高さとのUIWebViewを作成し、WebViewの上のビュー
  2. コールloadHTMLString: "W " * 64, baseURL: nilに追加します。 (私の画面上で、これは「W」Sの4行全体で)
  3. クリックして、とが上
  4. コールloadHTMLString: "W " * 65, baseURL: nil表示されないコピー/貼り付け]メニューことに注意してください、「W」のいずれかで開催webview。
  5. をクリックしては、「W」のいずれかに保持するコピー/貼り付け]メニューがは私が

」を表示されないことに注意してください(私の画面上の最後の「W」は5行目にあります)ここで何が起こっているのか理解するために、いくつかのことを試しました。私は同じ手順を踏襲しますが、100ではなく101の高さから始めます。

私は、これはiOSのバグかもしれないと思いますか?多分?

は、私はXcodeの7.2.1

で、iOS 9.2を実行している、ここで誰もが、なぜこれが起こっされる可能性があります知っているか、またはその周りの仕事の任意の並べ替えがある場合、私はこの問題を解決するために使用することができますか?

+0

実際のデバイスのバグを複製できますか?シミュレータが常に100%正しく動作するとは限りません。 – OlDor

+0

これを実際のデバイスに複製しました。問題は解決しない。 – BananaNeil

+0

Webビューを101に設定できない理由は何ですか? –

答えて

3

私は無駄に、いくつかの回避策を試してみました。

唯一の解決策は、WKWebViewを使用してください。この問題はありません。

現在のところ、iOS 9の時点では、Interface BuilderでWKWebViewを追加することはできません。これはサポートされていないためです。あなたは限りWKWebViewヘッダはNS_UNAVAILABLEとしてそれを宣言して、IBに含めることはできません。

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

代わりに、あなたは財産としてそれを宣言することができ、そしてそのように、あなたのviewDidLoad実装でそれをインスタンス化します。

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

私は先に進んでこれを正解とマークします。なぜなら、それは働く(ほとんどの場合)ためです。それは、UIWebViewからWKWebViewへの完全に簡単な切り替えではありませんでしたが、それは正しいことかもしれません。 – BananaNeil

1

まあ、webviewは、純粋な文字列ではなく、HTMLコードを読み込むと、混乱するかもしれません。先頭に<!DOCTYPE HTML>を追加すると、文字列の長さにかかわらず選択することができます。 Web表示用にtrueにscalesPageToFitを設定

+0

これは実際には真実ではないようです。 – BananaNeil

+0

私はそれを試して、それは私のために働く。このように書いていますか? 'loadHTMLString:" <!DOCTYPE HTML>あなたは何を望みますか "、baseURL:nil' – Terence

0

は、問題を解決するようだが、その99以下、同じ問題が解決しない場合は高さが100である場合にのみ。しかしscalesPageToFit間と、この機能と、それはここで起こっ浮動小数点演算の問題のいくつかの種類のように思える101,100,99の高さを見てみると100の高さのための関係を見てその奇妙な。間違いなくバグ。

高さを100.5に設定すると、コンテンツを選択できるようになりました。 Webビューの実装で何らかの問題を四捨五入しているようです。

ウェブビューのスクロールビューのcontentSizeを見ると、scrollSubscription contentSizeが100を超えたように見えます。したがって、webviewDidFinishLoadを処理してcontentSizeが<の場合は、<br>を追加して文字列をリロードできます。 100未満の場合は、読み込み中に毎回<br>を追加します。これはあなたのために働くはずです。

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) 
    } 
} 
関連する問題