Изменение диапазона CollectionView, когда вращающийся телефон не работает - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь изменить диапазон CollectionView при вращении моего iPhone. Чтобы было проще, просто покажите 2 столбца в портретной ориентации и 4 столбца в альбомной ориентации. Он работает при повороте из портретного в ландшафтный режим, но при повороте обратно в портретный режим он всегда показывает 1 столбец. Мой код любит,

    VideoCollectionView = new CollectionView()
        {
            ItemsLayout = new GridItemsLayout(2, ItemsLayoutOrientation.Vertical),
        };
    ...

    private static double screen_width = 1280.0;
    private static double screen_height = 720.0;

    protected override void OnSizeAllocated(double width, double height)
    {
        base.OnSizeAllocated(width, height);

        if ((Math.Abs(screen_width - width) > minimum_double) || (Math.Abs(screen_height - height) > minimum_double))
        {
            screen_width = width;
            screen_height = height;

            int split;
            if (screen_width > screen_height)
            {   // landscape mode
                split = 4;
            }
            else
            {   // portrait mode
                split = 2;
            }

            VideoCollectionView.ItemsLayout = new GridItemsLayout(split, ItemsLayoutOrientation.Vertical);
        }
    }

Это ошибка? Или я должен использовать другие способы? Спасибо за помощь.

1 Ответ

1 голос
/ 17 февраля 2020

Вы можете использовать Singleton для сохранения текущей ориентации. Потому что неразумно устанавливать размер экрана как значение s stati c. Возможно, это вызовет проблему на устройстве другого размера.

public class CurrentDevice
{
    protected static CurrentDevice Instance;
    double width;
    double height;

    static CurrentDevice()
    {
        Instance = new CurrentDevice();
    }
    protected CurrentDevice()
    {
    }

    public static bool IsOrientationPortrait()
    {
        return Instance.height > Instance.width;
    }

    public static void SetSize(double width, double height)
    {
        Instance.width = width;
        Instance.height = height;
    }
}

И в методе

protected override void OnSizeAllocated(double width, double height)
{
   base.OnSizeAllocated(width, height);


   if (CurrentDevice.IsOrientationPortrait() && width > height || !CurrentDevice.IsOrientationPortrait() && width < height)
   {
      int split;
      CurrentDevice.SetSize(width, height);

      // Orientation got changed! Do your changes here
      if (CurrentDevice.IsOrientationPortrait())
      {
         // portrait mode
         split = 2;
      }

      else
      {
         // landscape mode
         split = 4;
      }

      VideoCollectionView.ItemsLayout = new GridItemsLayout(split, ItemsLayoutOrientation.Vertical);
   }


}
...