iOS中自定义对话框的动态高度
Posted
技术标签:
【中文标题】iOS中自定义对话框的动态高度【英文标题】:Dynamic height for custom dialog in iOS 【发布时间】:2019-11-13 16:01:00 【问题描述】:我正在尝试创建一个内部带有 UITableView 的自定义对话框。 我想要实现的是尽可能低的高度,这意味着它应该只包裹 tableview。 但是当 tableview 有太多项目时(意味着它的高度大于屏幕),我希望对话框从屏幕顶部和底部有 20 px 的边距。 因此,如果 tableview 有 2 个项目,则对话框的高度应为例如 20 px。但是如果 tableview 有 200 个项目,则对话框的高度应该几乎占据整个屏幕高度并且其内容可以滚动。Dialog with few itemsDialog with multiple items
目前如果tableview有多个项目,我只能看到一些项目,对话框的顶部和底部消失了。 谢谢。 编辑:我忘了提到我打算只使用情节提要来实现这一点,使用约束和改变内容拥抱和压缩的优先级。
【问题讨论】:
【参考方案1】:开始工作了! 我所要做的就是将顶部和底部约束从“=”更改为“>=”。 所以现在它允许对话框的高度更小但不大于屏幕。无需代码。 谢谢大家的帮助。
【讨论】:
很棒的答案...!!!【参考方案2】:我的回答将包括几个部分。他们正在解决一个更普遍的问题,即如何有效地使用对话。
-
要创建对话框,请使用 UIViewControllerTransitioningDelegate、UIPresentationController 和 UIViewControllerAnimatedTransitioning。这是一个很长的路要走,但它会让您的对话框演示文稿可重复使用。
要确定包含表格的对话框的大小,请设置对话框视图控制器的 peferredContentSize 属性。 UIPresentationController 将使用此属性来设置对话框高度。在设置 peferredContentSize 之前,您可以将高度调整为您喜欢的边距。
要计算表视图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
如果您有任何疑问,请告诉我
【讨论】:
感谢您的帮助。我还没有尝试过以编程方式进行,我希望从情节提要中实现这一点。猜测可以使用约束和更改内容拥抱和压缩的优先级来完成。以上是关于iOS中自定义对话框的动态高度的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Yii2 Gridview 中自定义默认数据确认对话框