iOS UIScrollView прокручивается при втором открытии представления в Xamarin.iOS - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь реализовать следующую структуру представлений в моем приложении Xamarin.iOS.Я использую FluentLayout и MvvmCross 6.0.1.

View (controller)
 - UIScrollView
   - UIView
      - UIView,
      - UIView/UILabel etc.
      - UIView/UILabel etc.
      - ...

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

Контроллер находится внутри MvxBaseViewController, то есть структура контроллеров выглядит следующим образом:

- DashBoard (MvxTabBarViewController, WrapInNavigationController=true)
  - Tab1 (MvxBaseViewController)
  - Tab2 (MvxBaseViewController)
  - Tab3 (MvxBaseViewController)
    - The problematic view (MvxBaseViewController)

Я следовал этому руководству при настройке следующих ограничений:

var innerView = new UIView();
innerView.AddSubview(view1);
innerView.AddSubview(view2);
innerView.AddSubview(view3);

innerView.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints();
innerView.AddConstraints(
    view1.AtTopOf(innerView).Plus(21.0f),
    view1.WithSameCenterX(innerView),
    view1.WithSameWidth(innerView).WithMultiplier(0.8f),
    view1.Height().EqualTo(44f),
    view2.Below(view1).Plus(10.0f),
    view2.WithSameCenterX(innerView),
    view2.WithSameWidth(innerView).WithMultiplier(0.9f),
    view2.Height().EqualTo(16.0f),
    view3.Below(view2).Plus(21.0f),
    view3.WithSameCenterX(innerView),
    view3.WithSameWidth(innerView).WithMultiplier(0.9f),
    view3.Height().EqualTo(40.0f),
);

var scrollView = new UIScrollView();
scrollView.ShowsHorizontalScrollIndicator = false;
scrollView.AddSubview(innerView);

scrollView.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints();
scrollView.AddConstraints(
    innerView.AtTopOf(scrollView, 0),
    innerView.AtBottomOf(scrollView, 0),
    innerView.AtLeadingOf(scrollView, 0),
    innerView.AtTrailingOf(scrollView, 0)
);

//scrollView.DirectionalLockEnabled = true;
View.AddSubview(scrollView);

View.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints();
View.AddConstraints(
    //scrollView.WithSameWidth(View),
    //scrollView.WithSameHeight(View),
    innerView.WithSameWidth(View),
    innerView.WithSameHeight(View).SetPriority(250),
    scrollView.AtTopOf(View, 0),
    scrollView.AtBottomOf(View, 0),
    scrollView.AtLeadingOf(View, 0),
    scrollView.AtTrailingOf(View, 0)
);

Я подозреваю, что проблема связана с ограничениями, но я не смог понятьчто не так.У вас есть идеи, как это решить?

1 Ответ

0 голосов
/ 30 сентября 2018

Так что я потратил некоторое время на эту тему и не смог найти правильный способ ограничить свои взгляды.Я попытался реализовать этот макет в xib, но переопределение автоматически сгенерированных ограничений в коде не помогло.

Наконец я решил это, удалив innerView и поместив все внутри scrollView .Затем в ViewDidAppear() я увеличил ContentSize scrollView в вертикальном направлении.

scrollView = new UIScrollView();

scrollView.AddSubviews(view1,
                       view2,
                       view3);
scrollView.ShowsHorizontalScrollIndicator = false;
scrollView.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints();

scrollView.AddConstraints(
    view1.AtTopOf(scrollView).Plus(21.0f),
    view1.WithSameCenterX(scrollView),
    view1.WithSameWidth(scrollView).WithMultiplier(0.8f),
    view1.Height().EqualTo(44f),

    view2.Below(view1).Plus(10.0f),
    view2.WithSameCenterX(scrollView),
    view2.WithSameWidth(scrollView).WithMultiplier(0.9f),
    view2.Height().EqualTo(16.0f),

    view3.Below(view2).Plus(21.0f),
    view3.WithSameCenterX(scrollView),
    view3.WithSameWidth(scrollView).WithMultiplier(0.9f),
    view3.Height().EqualTo(40.0f)
);

View.AddSubview(scrollView);
View.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints();

View.AddConstraints(
    scrollView.AtTopOf(View, 0),
    scrollView.AtBottomOf(View, 0),
    scrollView.AtLeadingOf(View, 0),
    scrollView.AtTrailingOf(View, 0),
    scrollView.WithSameCenterX(View),
    scrollView.WithSameCenterY(View)
);

И в ViewDidAppear:

scrollView.ContentSize = new CGSize(View.Bounds.Width, scrollView.Bounds.Height + 300);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...