【问题标题】:Dynamic height for custom dialog in iOSiOS中自定义对话框的动态高度
【发布时间】:2019-11-13 16:01:00
【问题描述】:

我正在尝试创建一个内部带有 UITableView 的自定义对话框。 我想要实现的是尽可能低的高度,这意味着它应该只包裹 tableview。
但是当 tableview 有太多项目时(意味着它的高度大于屏幕),我希望对话框从屏幕顶部和底部有 20 px 的边距。
因此,如果 tableview 有 2 个项目,则对话框的高度应为例如 20 px。但是如果 tableview 有 200 个项目,则对话框的高度应该几乎占据整个屏幕高度并且其内容可以滚动。

Dialog with few items
Dialog with multiple items

目前如果tableview有多个项目,我只能看到一些项目,对话框的顶部和底部消失了。
谢谢。

编辑:我忘了提到我打算只使用情节提要来实现这一点,使用约束和改变内容拥抱和压缩的优先级。

【问题讨论】:

    标签: ios swift uitableview dialog


    【解决方案1】:

    开始工作了!
    我所要做的就是将顶部和底部约束从“=”更改为“>=”。 所以现在它允许对话框的高度更小但不大于屏幕。无需代码。
    谢谢大家的帮助。

    【讨论】:

    • 很棒的答案...!!!
    【解决方案2】:

    我的回答将包括几个部分。他们正在解决一个更普遍的问题,即如何有效地使用对话。

    1. 要创建对话框,请使用 UIViewControllerTransitioningDelegate、UIPresentationController 和 UIViewControllerAnimatedTransitioning。这是一个很长的路要走,但它会让您的对话框演示文稿可重复使用。
    2. 要确定包含表格的对话框的大小,请设置对话框视图控制器的 peferredContentSize 属性。 UIPresentationController 将使用此属性来设置对话框高度。在设置 peferredContentSize 之前,您可以将高度调整为您喜欢的边距。
    3. 要计算表视图you can 的大小,请使用多个选项。 table.layoutIfNeeded() 对我有用。

    更新:check out 我写的关于这种方法的文章。

    【讨论】:

      【解决方案3】:

      您需要动态设置tableView 的高度,因此给它两个位置约束(即centerX,centerY),一个固定宽度约束,然后一个高度约束设置为某个任意常数(0)。对高度约束采取一个出口。每当您更新支持 tableview 的数据时,您都会采用计算出的 tableview 高度和超级视图高度的min 并将高度约束常量设置为该值,然后在 tableView 的超级视图上调用 setNeedsLayout。这样,tableview 要么是其内容的高度,要么如果内容太大,则为 superview 的高度,它会滚动。

      tableViewHeightConstraint.constant = min(superview?.bounds.size.height ?? 0, numberOfCells * heightPerCell + headerAndFooterSize)
      superview?.setNeedsLayout()
      

      【讨论】:

      • 感谢您的帮助。我已经有一个用于 tableview 高度的出口变量,我会根据我拥有的项目数量进行更新。我希望我可以使用故事板中的约束来实现这一点。
      • 如果您想在不触及高度限制的情况下进行操作,那么您无需设置任何尺寸限制。然后系统使用视图的intrinsicContentSize 来计算其高度和宽度约束。您将需要继承 UITableView 并覆盖 intrinsicContentSize 并且您仍然需要在项目数量发生变化时使布局无效;我认为使用我上面提供的解决方案更容易。
      【解决方案4】:

      我猜你知道在显示对话框之前你有多少项目,我猜你的对话框是一个自定义视图 (xib)

      如果这个前提是真的,你可以用这条线来解决。

      let dialog = CustomDialog(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: (heighCell * elements) + (heightButtonClose) + (heighTitle))
      dialog.center = self.view.center
      

      如果您有任何疑问,请告诉我

      【讨论】:

      • 感谢您的帮助。我还没有尝试过以编程方式进行,我希望从情节提要中实现这一点。猜测可以使用约束和更改内容拥抱和压缩的优先级来完成。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多