質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

1回答

3288閲覧

Xamarin.Formsにおいて、WebViewの高さを表示内容に応じて動的に変更したい。

aimysato

総合スコア6

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2018/05/30 02:51

前提・実現したいこと

Xamarin.Formsを使ってiOS/Andoroidアプリケーションを作っています。
あらかじめ入力されたhtml・cssなどによって整形されたコードを読み込んで、
WebViewで内容を表示するという仕組みを作ったのですが、
内容に応じて高さをアジャストさせる方法が見つからない・思いつきません。

※WebViewに意図した内容が来ているかどうかについては、HeightRequestに適当な整数を与えることで表示領域を作り、確認済です。

発生している問題・エラーメッセージ

前述の通りです。

該当のソースコード

下記のようになっており、WebViewの中身が変化します。
この中身に応じて、高さを適切に調節する方法を考えています。

var Contents = new Xamarin.Forms.HtmlWebViewSource {     Html = 〜データベースから取得したテキスト(html・css)〜, }; WebView1.Source = Contents;

試したこと

・Xamarin.Formsのカスタムレンダラーを用いてなんとかできないか考えました。
・(iOSネイティブは未経験なので)Swift3について調べ、カスタムレンダラーで作成するWebviewを使い、
OnElementChangedのタイミングで(もとい、これ以外のタイミングを使う方法がわかりませんでした)

iOSであれば
・UIKit.UIViewContentMode.ScaleAspectFit を入れてはどうか?
→結果:変化なし

・サイズを取得して再描画してなんとかできないか?
var WebviewWidth = UIKit.UIScreen.MainScreen.Bounds.Width;
var WebviewHeight = UIKit.UIScreen.MainScreen.Bounds.Height;
var DrawRectParameter = new CoreGraphics.CGRect(0, 0, WebviewWidth, WebviewHeight);
base.Draw(DrawRectParameter);
→結果:変化なし

・SizeToFitメソッドなら?
base.SizeToFit();
this.SizeToFit();
→結果:変化なし

・ScalesPageToFitプロパティをtrueにすれば?
this.ScalesPageToFit = true;
→結果:HeightRequestで指定した高さに合わせる形で内容をフィットさせる(縮小・拡大する。ViewPortのような感じです。)

補足情報(FW/ツールのバージョンなど)

・macOS sierra Ver10.12.6
・Visual Studio Community Edition 2017
・Xamarin Forms Ver2.3.4.270

以上です。何かご存知のことがあれば、教えていただければと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

試したわけではないので自分ならこう考えるといったヒント程度で回答します。

カスタムレンダラーに便利なプロパティ等があるか不明なので、自力でやる方法について検討します。
目的が「高さを表示内容に応じて動的に変更したい」ということなので、

  1. 表示されているコンテンツの高さを検知する
  2. 任意のサイズにWebViewの高さを変更する

という2点をクリアできればOKかと考えます。

1に関してですが、恐らくWebViewの外からコンテンツのサイズを検知することは出来ないと考えます。
ですのでJavaScript側でロードが完了したらコンテンツの高さを取得して、Xamarin.Forms側に伝えてあげれば良いかと考えます。
WebViewのNavigatingやNavigatedのイベントを使えばForms側に値を受け渡すことが可能です。

2に関してはHeightRequestを指定すれば良いかと考えますが、
実際に試してみないとうまくできるかわからないですね。
ボタンを押したときなどにWebViewのサイズが変更できるかどうかなど試してみてください。

投稿2018/05/30 04:48

yamataka3

総合スコア145

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aimysato

2018/06/04 02:26

返答が遅れて申し訳ありません。 回答、ありがとうございます。 教えていただいた内容を元に調査し、コードを記述しているのですが、 1に関しては、 どうやらAndroidの場合は上記のNavigating・Navigatedのイベントが発生しない(自分でのテストと、各種海外フォーラムの情報です)ようで、 Androidに於いてどう対応しようか調べている状態です。 AndroidネイティブのOnPageFinishedというメソッドを用いることができれば、期待した動作に一歩近づくのではないかと考えているのですが実現できず、マイクロソフトのサンプルを確認・記述しながら突破口がないか考えております。(最下部に参照しているページのURLを記載しておきます。) 2に関しては、 HeightRequestに値を与えることで変化するのは確認していたので、 もし指定した値に高さが変化しない場合は、イベントのタイミング・そもそもイベントを経由していないという線から考えていくことができると思っています。 以上になります。手詰まり状態だったので、調査する糸口が見えただけでも助かっております。ありがとうございます。 <参考> 確認中のページ‥ HybridWebView を実装します。 - Xamarin | Microsoft Docs https://docs.microsoft.com/ja-jp/xamarin/xamarin-forms/app-fundamentals/custom-renderer/hybridwebview
yamataka3

2018/06/05 04:25

>どうやらAndroidの場合は上記のNavigating・Navigatedのイベントが発生しない(自分でのテストと、各種海外フォーラムの情報です)ようで、 自分のところではAndroidでもiOSでもNavigating・Navigatedでハンドリング処理書いて動いています 端末、OS、XFバージョンなど見直すことで動くようになるかも?
yamataka3

2018/06/05 08:10

自分が動作確認しているXamarin.Formsのバージョンは2.4.0.280 自前でWebViewのBehaviorを作って、NavigatingとNavigatedをViewModelで利用しています。 汎用的にBehaviorを作るならEventToCommandBehaviorとか作るかどっかから引っ張て来ても良いかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問