2016-04-18 3 views
3

У меня есть проблема с абсолютным расположением в Xamarin формах на андроид 6.0 MarshmellowAbsoluteLayout не заполнит экран

при настройке представления для заполнения всего экрана там остаются зазор 1px в нижней части экрана.

Необычно это не происходит, если вы поворачиваете экран на пейзаж. Или на 4,4

XAML:

<?xml version="1.0" encoding="utf-8" ?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      x:Class="XamarinTest.Page1"> 
    <AbsoluteLayout BackgroundColor="White"> 
    <BoxView BackgroundColor="Red" AbsoluteLayout.LayoutBounds="0,0,1,1" AbsoluteLayout.LayoutFlags="All"> 

    </BoxView> 
    </AbsoluteLayout> 
</ContentPage> 

снимки экрана: (это от против эмуляторов, но я также получить такое же поведение на устройствах, например, Samsung Galaxy 6)

1px white line on 6.0.0 (you are gona have to zoom)

В этом примере я использую boxview fillign на экране, но его любое размещение размещается в нижней части экрана.

Что я ищу - это своего рода обходной или пользовательский рендерер, который гарантирует, что элементы, нарисованные на 1,1 или растягивающие всю высоту экрана, помещаются в нижнюю часть экрана или растягиваются в нижней части экрана

+0

Вы получаете похожий результат на приложение Xamarin.Android? –

+0

Я не сделал один из них. Мне нужно решение для форм, так как у нас есть большое количество страниц, использующих абсолютный макет. – Ewan

ответ

5

Это подтверждено ошибка в Xamarin.Forms 2.1.0: https://bugzilla.xamarin.com/show_bug.cgi?id=40092.

Вы можете исправить это, переопределив LayoutChildren и отправив один пиксель высоты больше на базовую реализацию.

public class MyAbsoluteLayout : AbsoluteLayout 
{ 
    protected override void LayoutChildren(double x, double y, double width, double height) 
    { 
     base.LayoutChildren(x, y, width, height+1); 
    } 
} 

И затем использовать его в XAML

<local:MyAbsoluteLayout BackgroundColor="White"> 
    <BoxView BackgroundColor="Red" AbsoluteLayout.LayoutBounds="0,0,1,1" AbsoluteLayout.LayoutFlags="All"> 

    </BoxView> 
</local:MyAbsoluteLayout> 

Если это не помогает, вы можете попробовать переопределить функцию LayoutChildren и фальсифицировать результат, как

public class MyAbsoluteLayout : AbsoluteLayout 
{ 
    private readonly MethodInfo _computeLayout; 

    public MyAbsoluteLayout() 
    { 
     _computeLayout = typeof(AbsoluteLayout).GetTypeInfo().GetDeclaredMethod("ComputeLayoutForRegion"); 
    } 

    protected override void LayoutChildren(double x, double y, double width, double height) 
    { 
     foreach (View logicalChild in Children) 
     { 
      Size region = new Size(width, height); 
      Rectangle layoutForRegion = (Rectangle)_computeLayout.Invoke(null, new object[] { logicalChild, region }); 
      layoutForRegion.X += x; 
      layoutForRegion.Y += y + 1; 
      Rectangle bounds = layoutForRegion; 
      logicalChild.Layout(bounds); 
     } 
    } 
} 
+0

Спасибо, jeeze. Я больше не удивлюсь этим ошибкам. – Ewan

+0

Получив эту проблему, спасибо за отправку ссылки на ссылку! –