【问题标题】:How to calculate UIViewController's intrinsic content height?如何计算 UIViewController 内在内容高度?
【发布时间】:2020-09-23 20:39:48
【问题描述】:

我需要确定UIViewController 的高度,以便在底部表中显示它。为了创建底部表,我使用FitterSheets 图书馆。它接受UIViewController 我想在工作表内显示和一些高度。然后,库以我指定的高度显示我的视图控制器。似乎一切正常且有意义,但是我如何计算视图控制器的高度?它可以是动态的(例如,stackview 中的动态视图)。在显示它之前我无法计算它的高度。换句话说,我不知道我的屏幕内容的大小是多少,因为我从服务器获取数据。如果你不明白问题,这里是代码片段:

present(SheetViewController(myViewController, size: ?), animated: false); 

我应该通过什么尺寸?当然我可以近似计算(例如,根据我从 API 获得的数据,我可以将数据量乘以屏幕中某个视图的高度)。但是,这将是近似的,不准确的。

我认为我的解决方案应该如下:我在呈现SheetViewController 时没有指定任何高度。我只是在我的视图控制器的视图完全出现后调整SheetViewController 的大小。伪代码如下:

override viewDidAppear(_ animated: Bool) {
       super.viewDidAppear(animated)
       var contentSize = 0 
       view.subviews.forEach {
           contentSize += $0.frame.height
       }
       sheetViewController?.resize(contentSize); 
}

但我认为这不是正确的解决方案,而且它实际上不起作用。那么,解决我的问题的最佳方法是什么?如何显示高度等于内容高度的底页?

【问题讨论】:

    标签: ios swift uiviewcontroller autolayout bottom-sheet


    【解决方案1】:

    按照库文档中的说明:

    如果视图控制器小于指定的尺寸,它只会增长到呈现的视图控制器的内在高度。如果它更大,它将在初始化程序或 setSizes 函数中指定的每个高度处停止。

    因此,您可以删除viewDidAppear 中的代码,只需添加一个尺寸数组,其中第一个尺寸是确定工作表初始尺寸的尺寸,例如:

    present(SheetViewController(myViewController, sizes: [.fixed(100), .fullScreen]), animated: false)
    

    【讨论】:

    • 但是如何确定初始大小呢?你怎么来的100?如何计算它以仅显示没有空格的内容?这就是问题所在。
    • 初始高度是默认值,我没有使用过这个库,但我认为这也可能是零,所以这取决于你的 UI,为了避免显示空格,你可以使用最小值(例如标题标签的高度)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    相关资源
    最近更新 更多