菜鸟教程小白 发表于 2022-12-13 15:58:34

ios - Xamarin.Forms 和 iOS : how to combine UseSafeArea and a background image?


                                            <p><p>我有一个关于 iOS 使用 <strong>安全区域</strong> 的问题。</p>

<p>我通过<code>RelativeLayout</code> 使用<strong>背景图片</strong>,并在此背景图片上显示<strong>表单</strong>。我在表单的容器上为 iOS 使用了 <code>margin</code>:这很好用,但是 <strong>iPhone X</strong> 上的渲染效果不是很好。</p>

<pre><code>&lt;RelativeLayout&gt;

    &lt;Image Source=&#34;background.jpg&#34; Opacity=&#34;0.75&#34;
         Aspect=&#34;AspectFill&#34;
         RelativeLayout.WidthConstraint =
               &#34;{ConstraintExpression Type=RelativeToParent, Property=Width}&#34;
         RelativeLayout.HeightConstraint =
               &#34;{ConstraintExpression Type=RelativeToParent, Property=Height}&#34; /&gt;

    &lt;ScrollView RelativeLayout.WidthConstraint =
                  &#34;{ConstraintExpression Type=RelativeToParent, Property=Width}&#34;
               RelativeLayout.HeightConstraint =
                  &#34;{ConstraintExpression Type=RelativeToParent, Property=Height}&#34;&gt;   
    &lt;ScrollView.Margin&gt;               
      &lt;OnPlatform x:TypeArguments=&#34;Thickness&#34;&gt;
            &lt;On Platform=&#34;iOS&#34; Value=&#34;0, 20, 0, 0&#34; /&gt;
      &lt;/OnPlatform&gt;
    &lt;/ScrollView.Margin&gt;

    &lt;StackLayout&gt;
      &lt;!-- Header --&gt;
      &lt;StackLayout VerticalOptions=&#34;Start&#34;&gt;
            &lt;fnc:HunterHeader /&gt;
      &lt;/StackLayout&gt;

      &lt;!-- Form --&gt;
      &lt;StackLayout VerticalOptions=&#34;CenterAndExpand&#34;
                     Spacing=&#34;6&#34; Margin=&#34;20&#34;&gt;
            &lt;!-- ... --&gt;
      &lt;/StackLayout&gt;
    &lt;/StackLayout&gt;
&lt;/RelativeLayout&gt;
</code></pre>

<p>所以我尝试将 <code>UseSafeArea</code> 设置为 <strong>true</strong>,但我得到了顶部和底部边距。 </p>

<p><strong><em>是否有可能解决这个问题,并将 UseSafeArea 和背景图像结合起来?
或者有没有办法只为 iPhone X 添加特定的边距?</em></strong> </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><h1>选项 1 - 将安全区域应用于特定控件而不是页面</h1>

<p>安全区域可以设置在特定控件而不是整个页面上。例如,可以将安全区域值设置为 <code>ScrollView</code> 的边距或填充。还需要考虑方向更改(如果您的应用支持它们)。</p>

<p><strong>XAML</strong></p>

<pre class="lang-xaml prettyprint-override"><code>&lt;RelativeLayout&gt;

    &lt;Image Aspect=&#34;AspectFill&#34; Source=&#34;background.png&#34;
         RelativeLayout.WidthConstraint = &#34;{ConstraintExpression Type=RelativeToParent, Property=Width}&#34;
         RelativeLayout.HeightConstraint = &#34;{ConstraintExpression Type=RelativeToParent, Property=Height}&#34;/&gt;

    &lt;ScrollView x:Name=&#34;scrollView&#34;
                RelativeLayout.WidthConstraint = &#34;{ConstraintExpression Type=RelativeToParent, Property=Width}&#34;
                RelativeLayout.HeightConstraint = &#34;{ConstraintExpression Type=RelativeToParent, Property=Height}&#34;&gt;   

      &lt;StackLayout Margin=&#34;20, 0&#34; Spacing=&#34;20&#34;&gt;

            &lt;!-- Header --&gt;
            &lt;StackLayout&gt;
                &lt;BoxView BackgroundColor=&#34;Black&#34; HeightRequest=&#34;50&#34; /&gt;
            &lt;/StackLayout&gt;

            &lt;!-- Form --&gt;
            &lt;StackLayout Spacing=&#34;20&#34;&gt;
                &lt;BoxView BackgroundColor=&#34;White&#34; HeightRequest=&#34;150&#34; /&gt;
                &lt;BoxView BackgroundColor=&#34;White&#34; HeightRequest=&#34;150&#34; /&gt;
                &lt;BoxView BackgroundColor=&#34;White&#34; HeightRequest=&#34;150&#34; /&gt;
                &lt;BoxView BackgroundColor=&#34;White&#34; HeightRequest=&#34;150&#34; /&gt;
                &lt;BoxView BackgroundColor=&#34;White&#34; HeightRequest=&#34;150&#34; /&gt;
                &lt;BoxView BackgroundColor=&#34;White&#34; HeightRequest=&#34;150&#34; /&gt;
            &lt;/StackLayout&gt;

      &lt;/StackLayout&gt;

    &lt;/ScrollView&gt;

&lt;/RelativeLayout&gt;
</code></pre>

<p><strong>代码隐藏</strong></p>

<pre class="lang-cs prettyprint-override"><code>    private double width = 0;
    private double height = 0;
    private bool safeAreaSetInitially;

    protected override void OnAppearing()
    {
      base.OnAppearing();

      if (!this.safeAreaSetInitially)
      {
            this.SetSafeAreaOnContentContainer();
            this.safeAreaSetInitially = true;
      }
    }

    protected override void OnSizeAllocated(double width, double height)
    {
      base.OnSizeAllocated(width, height); //must be called

      if (Math.Abs(this.width - width) &gt; double.Epsilon || Math.Abs(this.height - height) &gt; double.Epsilon)
      {
            this.width = width;
            this.height = height;

            if (this.width &gt; this.height)
            {
                // reconfigure for landscape if needed
            }
            else
            {
                // reconfigure for portrait if needed
            }

            // reset safe area on rotation as the landscape/portrait safe areas are different
            this.SetSafeAreaOnContentContainer();
      }
    }

    private void SetSafeAreaOnContentContainer()
    {
      if (Device.RuntimePlatform == Device.iOS)
      {
            // set safe insets on content that you want to be within the safe area
            var safeInsets = On&lt;Xamarin.Forms.PlatformConfiguration.iOS&gt;().SafeAreaInsets();
            safeInsets.Top += 20; // add any other custom design margin specific to iOS (the extra 20 came from the original XAML)
            this.scrollView.Margin = safeInsets;
      }
    }
</code></pre>

<p><strong>结果</strong></p>

<h2> <a href="/image/3onzl.gif" rel="noreferrer noopener nofollow"><img src="/image/3onzl.gif" alt="enter image description here"/></a> </h2>

<h1>选项 2 - 使用 <a href="https://learn.microsoft.com/en-us/dotnet/api/xamarin.forms.page.backgroundimage?view=xamarin-forms#Xamarin_Forms_Page_BackgroundImage" rel="noreferrer noopener nofollow">Page.BackgroundImage</a>属性</h1>

<p>根据要求,另一种选择是只使用 <code>Page</code> 的 <code>BackgroundImage</code> 属性(它不受 <code>On<Xamarin.Forms 的影响。 PlatformConfiguration.iOS>().SetUseSafeArea(true)</code> 方法)。这种方法的一个问题是 BackgroundImage 在 iOS 中是“平铺的”。要解决此问题,请创建一个不会“平铺”<a href="https://learn.microsoft.com/en-us/dotnet/api/xamarin.forms.page.backgroundimage?view=xamarin-forms#Xamarin_Forms_Page_BackgroundImage" rel="noreferrer noopener nofollow">BackgroundImage</a> 的自定义 <code>Xamarin.Forms.ContentPage</code> 渲染器。 .这是一个 <a href="https://forums.xamarin.com/discussion/89781/xamarin-forms-ios-prevent-tile-style-background-image-for-contentpage" rel="noreferrer noopener nofollow">example</a> .</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - Xamarin.Forms 和 iOS : how to combine UseSafeArea and a background image?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/51553694/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/51553694/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - Xamarin.Forms 和 iOS : how to combine UseSafeArea and a background image?