Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS中自定义对话框的动态高度_Ios_Swift_Uitableview_Dialog - Fatal编程技术网

iOS中自定义对话框的动态高度

iOS中自定义对话框的动态高度,ios,swift,uitableview,dialog,Ios,Swift,Uitableview,Dialog,我正在尝试创建一个自定义对话框,其中包含UITableView。 我想要达到的是尽可能低的高度,这意味着它应该只包装tableview。 但是当tableview有太多的项目时(意味着它的高度比屏幕大),我希望对话框从屏幕顶部和底部有20像素的边距。 因此,如果tableview有2个项目,则对话框的高度应为20 px。但是,如果tableview有200个项目,对话框的高度应该几乎占整个屏幕的高度,并且其内容可以滚动。 当前,如果tableview有多个项目,我只能看到一些项目,对话框的顶部

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


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


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

我猜您在显示对话框之前知道有多少项,并且我猜您的对话框是一个自定义视图(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

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

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

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

  • 要创建对话框,请使用UIViewControllerTransitioningDelegate、UIPresentationController和UIViewControllerInitiatedTransitioning。这是一个漫长的过程,但它将使您的对话框演示可重用
  • 若要确定包含表的对话框的大小,请设置对话框视图控制器的peferredContentSize属性。UIPresentationController将使用此属性设置对话框高度。在设置peferredContentSize之前,您可以根据自己喜欢的边距调整高度
  • 要计算表视图的大小,请使用几个选项。table.layoutIfNeeded()对我有用
  • 更新:我写的关于这种方法的文章。

    成功了!
    我所要做的就是将顶部和底部约束从“=”更改为“>=”。 因此,现在它允许对话框具有较小的高度,但不大于屏幕。不需要代码。

    谢谢大家的帮助。

    谢谢大家的帮助。我还没有尝试过用编程的方式来实现它,我希望通过故事板来实现这一点。我猜这可以通过使用约束和更改内容拥抱和压缩的优先级来实现。谢谢您的帮助。我已经有了一个tableview高度的outlet变量,我会根据我拥有的项目数量进行更新。我希望我可以在故事板中使用约束来实现这一点。如果你想在不触及高度约束的情况下实现这一点,那么你不需要设置任何大小约束。然后,系统使用视图的
    intrinsicContentSize
    计算其高度和宽度约束。您将需要子类化
    UITableView
    并覆盖
    intrinsicContentSize
    ,并且每当项目数量发生变化时,仍需要使布局无效;我认为使用我上面提供的解决方案更容易。