当前位置: 首页 > 知识库问答 >
问题:

带静态工作台的动态类型和自定尺寸单元

乐正意智
2023-03-14

我有一个典型的主细节应用程序,它允许用户浏览对象的滚动列表,然后通过推送序列钻取任何特定对象的细节。滚动主列表是使用原型单元构建的UITableView,详细场景是具有固定数量的部分和单元的静态UITableView。

我想在我的应用程序中实现动态类型和自动调整单元格大小,以便用户可以更改基本字体大小。到目前为止,我已经成功地使用原型单元格的滚动列表制作了自定大小的单元格:使用Auto Layout,将每个标签中的行数设置为0,并设置tableView。rowHeight=UITableViewAutomaticDimension,则每个原型单元格的高度会增长或收缩,以适应其中文本的大小。

但是我无法在静态表视图中实现相同的效果。无论我使用自定义单元格还是内置单元格类型,字体都会增大/缩小,但单元格高度不会。

所以我的问题实际上是两个问题:1)是否可以在静态表视图中实现自调整大小的单元格,就像我对原型表视图所做的那样?和2)如果第一个问题的答案是否定的,我该如何编写代码来测量静态表视图单元格中标签的高度并相应地调整单元格高度?

谢谢你!

共有3个答案

林子石
2023-03-14

由于这是一个静态表,因此您无法取消单元格的排队,因此您必须为它们创建IBOutlet,我将它们保存在如下所示的数组中:

@IBOutlet var cells: [UITableViewCell]!  

然后必须实现heightForRowAtIndexPath并计算大小:

var rowSizes: [Int: CGFloat] = [:]

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return calculateHeightForCell(indexPath)
}

func calculateHeightForCell(indexPath: NSIndexPath) -> CGFloat {

    // check if we already calculated the height
    if let height = rowSizes[indexPath.row] {
        return height
    }

    // else, calculate it
    let cell = cells[indexPath.row]

    let size = cell.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)

    rowSizes[indexPath.row] = size.height

    return size.height
}

rowSizes的作用类似于缓存,它将保存行高度,因此只计算一次。更改字体大小时,只需清空rowSizes并刷新表,以便再次计算它们。

章振
2023-03-14

首先在类中添加这两个函数

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

其次,为了使UITableViewAutomaticDimension工作,请确保添加了与单元格容器视图相关的所有左、右、下和上约束。也不要忘记将标签的行数设置为零。

支铭晨
2023-03-14

静态表格视图返回在界面生成器中设置的行高。< code>tableView.rowHeight设置似乎被完全忽略。这显然是UIKit中的一个bug。

为了解决这个问题,只需覆盖-(CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath并返回UITableViewAutomaticDimension

 类似资料:
  • 一个机器或语言是用来计算的,根据计算机模型的定义,其操作的是存储器里的数据,就现在流行的用二进制实现的计算机中(曾出现过三进制计算机),数据本质都是0和1,但机器毕竟是为人服务的,解决的是现实问题,它操作的数据需要有现实的含义,所以基本上所有语言都有类型系统,即便是汇编和机器语言,也有整数和浮点的区别 类型系统是很复杂的理论,值得用一本厚书来写,好点的资料有《类型与程序设计语言》,但我没看懂,因为

  • 我问这个只是为了澄清我的想法是否正确。 如果在运行时解释变量的类型,则语言将动态类型化。这意味着您作为程序员可以更快地编写,因为您不必每次都指定类型。示例:Perl 静态/动态绑定-下面的链接清楚地解释了静态绑定和动态绑定的区别 我想问的主要问题从这里开始。我知道静态作用域和动态作用域之间的区别。然而,当我讨论堆栈溢出时,人们说C++和Python是静态作用域的。 给出一个错误。

  • 我正在尝试使用自动布局来自动调整大小,但我似乎无法使单元格根据内容调整大小。我很难理解单元格大小是如何从单元格contentView中的内容更新的。 以下是我尝试过的设置: 自定义,在其contentView中具有。 contentView的水平约束是:“H:|[_textView(320)]”,即固定在单元格左侧,显式宽度为320。 contentView的垂直约束是:“V:|-0-[[u te

  • 为便于开发,larva采用动态类型,于是首先遇到的一个问题就是,在转化为java的时候,如何处理动态类型带来的问题。乍一看,这个不是很复杂,已经有前车之鉴了,Cython就可以把python代码直接转化成C代码,我的做法和Cython有相似之处,但考虑效率问题,做了一点修改 (虽然第一版本并不实现class语法来自定义类,不过在论述这个问题的时候,假定有自定义类,因为主要矛盾就在自定义类的属性方面

  • 问题内容: 我对动态绑定和静态绑定感到非常困惑。我已经读过,在编译时确定对象的类型称为静态绑定,而在运行时确定它的称为动态绑定。 下面的代码会发生什么: 静态绑定还是动态绑定? 这表明什么样的多态性? 问题答案: 您的示例是 动态绑定 ,因为在运行时确定类型是什么,并调用适当的方法。 现在假设您也具有以下两种方法: 即使您更改为 这将打印出来,因为对的调用使用 静态绑定 ,并且编译器仅知道其类型。

  • 请有人给我解释一下输出的最后6行是如何打印出来的。我知道,由于静态绑定,前三行打印适当。 我不知道为什么第5行给出了输出,因为它是Ipod类型的,它没有任何歌曲方法,但它仍然打印输出。代码如下: 输出如下所示: