在 ScrollView 中使用动态 UIView 进行自动布局

Autolayout with a dynamic UIView in a ScrollView

我正在混合使用 Xamarin 和 XCode Interface Builder 来构建我的 UI。

如您在屏幕截图中所见,顶部的 PlaceholderView 可以包含不同的内容。我遇到的问题是试图将提交按钮保留在 ContentView 的底部。

我正在使用带有 ContentView 的 ScrollView 方法并在 IB 中设置约束。

在 ViewDidLoad() 中,我加载了 PlaceholderView 的内容,然后以编程方式设置了 PlaceholderView 的高度约束。

public override void ViewDidLoad()
{
   onlineSuspectDetails = OnlineSuspectDetailsView.Create();
   onlineSuspectDetails.BackgroundColor = UIColor.Gray;                    
   SuspectDetailsPlaceholderView.AddSubview(onlineSuspectDetails);
   SuspectDetailsPlaceholderView.HeightAnchor.ConstraintEqualTo(onlineSuspectDetails.HeightAnchor, 1).Active = true;
}

当然,我必须为提交按钮设置顶部和底部约束,以便它适用于一种类型 但我看不到根据 PlaceholderView 的高度更改它以使提交按钮保持在底部的方法。

如果我可以访问 Bottom 约束,我可以计算新的 Top 约束,但我找不到访问 Bottom 约束的方法。我该怎么做?

对于如何解决这个问题,是否有其他建议?

嗯……有点棘手……

可能有更好的方法,但这里有一种方法:

  • 橙色 = 主视图背景
  • 淡黄色 = 滚动视图背景
  • 灰色=UIView..."label / field pairs"容器; label/field 对是标准 UIStackView
  • 青色 = UIView..."details" 容器
  • 深绿色 = 按钮
  • 红色 = UIView...这是棘手的部分...是 "Shim" 按住底部的按钮

视图约束由 8 插入,因此我们可以更容易地看到它们,而不是它们占据了整个 screen/view。

位置/大小的灰色视图和详细信息视图约束是直截了当的(看起来您在这方面没有问题)。

在此方法中,我们使用 "Shim" 视图和一些大于或等于约束来管理 Button 的位置。

Shim 的前导和顶部固定为零,其高度约束设置为相对于滚动视图高度的 >= -30。它的 bottom 约束也设置为 >= 8 相对于 Details 视图的 bottom

这告诉自动布局将 Shim 的底部放置在距滚动视图底部不超过 30 磅的位置 AND 至少 详细信息视图底部以下 8 磅。

然后提交按钮的顶部被限制在 Shim 视图的底部。

我在 Interface Builder 中使用滚动视图时发现的一个 "quirk" - 让 IB 对必要的约束感到满意可能真的很难(也许不可能?)。它会显示冲突,但如果您遵循 IB 的 "fixes" 所需的布局就会失败。

我实际上并没有使用 IB / Storyboards,所以我只是专注于避免运行时的自动布局/约束冲突。

通过查看实际文件可能更容易理解,所以我将其作为 GitHub 存储库:https://github.com/DonMag/SWMoreScrollViewStuff

您实际上是如何将按钮添加到主视图的?我之前通过为除按钮之外的所有内容设置主 UIView 来完成类似的操作。然后我将按钮放在视图下方并对所有内容应用自动布局(在视图和按钮上应该只是 0,0,0,0)。这样您的按钮将始终位于视图的前面,您可以在包含的视图中执行其他所有操作!