水平旋转设备时界面出现问题

时间:2018-12-29 03:58:34

标签: xaml xamarin xamarin.forms

我的应用程序的界面分为一个标题(它是一个webview)和绝对内容,其中绝对包含第二个webview。

它在垂直方向上有效并且看起来很完美。

但是,当我水平转动设备时,割台会停止测量70,而会测量30...。 页眉降低了高度,尽管它具有固定的高度。

为什么会这样?有解决办法吗?

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:local="clr-namespace:PruebaHeight"
         x:Class="PruebaHeight.MainPage">
<ContentPage.Content>
    <StackLayout Spacing="0">

        <WebView x:Name="webview_header" HorizontalOptions="FillAndExpand" HeightRequest="70" BackgroundColor="Red"/>

        <AbsoluteLayout HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" BackgroundColor="Black">
            <!-- other things -->
            <ScrollView AbsoluteLayout.LayoutBounds="0,0,1,1" AbsoluteLayout.LayoutFlags="All" BackgroundColor="Green">
                <AbsoluteLayout HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Padding="0" BackgroundColor="Purple">
                    <WebView x:Name="webview" AbsoluteLayout.LayoutBounds="0,0,1,1" AbsoluteLayout.LayoutFlags="All" BackgroundColor="Blue" />
                </AbsoluteLayout>
            </ScrollView>
        </AbsoluteLayout>

    </StackLayout>
</ContentPage.Content>

1 个答案:

答案 0 :(得分:0)

您可以尝试像以下代码一样自定义视图。

XamWebView.cs

public class XamWebView: WebView
{

}

然后在您的代码中使用它。

var webview= new XamWebView();

webview.HorizontalOptions = LayoutOptions.Fill;
webview.VerticalOptions = LayoutOptions.StartAndExpand;

webview.WidthRequest = 70;
webview.HeightRequest = 70;

webview.Source = "https://www.google.com/";

在Android上创建自定义渲染器(运行时可以获取heightrequest的值)

using WebView = Android.Webkit.WebView;
[assembly: ExportRenderer (typeof(XamWebView), typeof(XamWebViewRenderer))]
namespace Core.Droid
{

public class XamWebViewRenderer : WebViewRenderer
{
    static XamWebView _xwebView = null;
    WebView _webView;

    public XamWebViewRenderer(Context context) : base(context)
    {

    }
    class XamWebViewClient : Android.Webkit.WebViewClient
    {
        public override async void OnPageFinished(WebView view, string url)
        {
            if (_xwebView != null)
            {
                int i = 10;
                while (view.ContentHeight == 0 && i-- > 0)
                    await System.Threading.Tasks.Task.Delay(100);
                _xwebView.HeightRequest = view.ContentHeight;
            }
        }
    }
    protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
    {
        base.OnElementChanged(e);
        _xwebView = e.NewElement as XamWebView;
        _webView = Control;

        if (e.OldElement == null)
        {
            _webView.SetWebViewClient(new XamWebViewClient());
        }

    }
}

}