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