在UITableView中,在cellforRowAt之后调用heightForRowAt

时间:2017-11-03 11:27:43

标签: ios swift uitableview

每当我重新加载tableView时,heightForRowAt之后都会调用cellForRowAt。它遵循的顺序是:

 numberofsections -> numberOfRowsInSection -> cellForRowAt -> heightForRow

我已经覆盖了numberOfSections, numberOfRowsInSection, viewForHeaderInSection个方法。这些会对调用heightForRowcellForRowAt的顺序产生影响吗?

我正在使用在iOS 11上运行的Xcode 9.1,Swift 3。

1 个答案:

答案 0 :(得分:0)

这里有两个选项:

  1. 以定义单元格大小的方式制作单元格的contentView。这意味着你的布局不应该垂直雄心勃勃。
  2. 手动计算尺寸。总结子视图之间的偏移量(高度)。这可能是计算label / textView大小的问题(保留帮助扩展以计算我使用的文本大小)。注意textView.contentInsets!你需要记住它才能获得正确的大小

    extension String {
         func height(withConstrainedWidth width: CGFloat, font: UIFont) -> CGFloat {
             let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude)
             let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin,
                                    attributes: [NSAttributedStringKey.font: font], context: nil)
    
             return ceil(boundingBox.height)
         }
    
         func width(withConstraintedHeight height: CGFloat, font: UIFont) -> CGFloat {
             let constraintRect = CGSize(width: .greatestFiniteMagnitude, height: height)
             let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin,
                                    attributes: [NSAttributedStringKey.font: font], context: nil)
    
             return ceil(boundingBox.width)
         }
    }
    
  3. 希望它会对你有所帮助!