iOS UIScrollView 在 Xamarin.iOS 中第二次打开视图时可滚动

iOS UIScrollView is scrollable the second time the view is opened in Xamarin.iOS

我尝试在我的 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)

我在设置如下约束时遵循 this guide

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)
);

我怀疑问题与约束有关,但我无法找出问题所在。你有什么解决办法吗?

所以我花了一些时间在这个话题上,找不到合适的方式来约束我的观点。我尝试在 xib 中实现此布局,但在代码中重新实现自动生成的约束没有帮助。

最后我通过删除 innerView 并将所有内容放在 scrollView 中解决了这个问题。然后在 ViewDidAppear() 中我在垂直方向增加了 scrollView 的 ContentSize

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);