我正在使用Swift 3.我有可扩展的表格视图单元格,但根据单击的单元格,是否可以获得不同的行高?例如,如果单击第一个单元格,我希望它返回420表示高度,如果单击其他单元格,我希望它返回300表示高度。
这是我的手机课。
class ResultsCell: UITableViewCell {
@IBOutlet weak var introPara : UITextView!
@IBOutlet weak var section_heading : UILabel!
class var expandedHeight : CGFloat = { get { return 420.0 } }
class var defaultHeight : CGFloat { get { return 44.0 } }
var frameAdded = false
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func awakeFromNib() {
super.awakeFromNib()
section_heading.translatesAutoresizingMaskIntoConstraints = false
}
func checkHeight() {
introPara.isHidden = (frame.size.height < ResultsCell.expandedHeight)
}
func watchFrameChanges() {
if(!frameAdded) {
addObserver(self, forKeyPath: "frame", options: .new, context: nil)
checkHeight()
}
}
func ignoreFrameChanges() {
if(frameAdded){
removeObserver(self, forKeyPath: "frame")
}
}
deinit {
print("deinit called");
ignoreFrameChanges()
}
// when our frame changes, check if the frame height is appropriate and make it smaller or bigger depending
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "frame" {
checkHeight()
}
}
}
我所尝试的是这样的。
var _expandedHeight : CGFloat = 420.0
class var expandedHeight : CGFloat { get { return _expandedHeight } set (newHeight) { _expandedHeight = newHeight } }
var isRow0 = false
override func awakeFromNib() {
super.awakeFromNib()
section_heading.translatesAutoresizingMaskIntoConstraints = false
if isRow0 {
ResultsCell.expandedHeight = 300.0
}
else {
ResultsCell.expandedHeight = 420.0
}
}
然后在TableViewController
...
// return the actual view for the cell
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let resultcell = tableView.dequeueReusableCell(withIdentifier: "resultCellTemplate", for: indexPath) as! ResultsCell
if indexPath.row == 0 {
resultcell.isRow0 = true
} else {
resultcell.isRow0 = false
}
return resultcell
}
但我在getter / setter行遇到错误:instance member _expandedHeight cannot be used on type ResultsCell
如何实现我想要的行为?
答案 0 :(得分:0)
使用tableview更新方法重新评估每个单元格的高度
self.tableView.beginUpdates()
self.tableView.endUpdates()
使用heightForRowAtIndexPath
自动计算对tableview单元格高度的更改
尝试设置你的身高w.r.t索引路径
让用户提到heightForRowAtIndexPath来计算正确的高度。
答案 1 :(得分:0)
您应该在TableView的ar
中执行此操作。
您的TableView有一个delegate
私有实例变量,其值应实现协议delegate
。该协议包含许多UITableViewDelegate
调用的函数,以便设置自己的外观。
欲了解更多信息:
UITableView
协议:
https://developer.apple.com/reference/uikit/uitableviewdelegate
UITableViewDelegate
UITableView
实例变量:
https://developer.apple.com/reference/uikit/uitableview#delegate
您要做的是在delegate
对象上实施tableView(_:heightForRowAt:)
方法。此方法有两个参数:第一个是UITableViewDelegate
本身,第二个是准备渲染的行的UITableView
。 IndexPath
是一个对象,其对应于正在呈现的单元格具有IndexPath
和section
属性。
您要做的是根据row
计算单元格是否展开的某种方式。
Swift IndexPath
参考:https://developer.apple.com/reference/foundation/indexpath
尝试基于IndexPath
本身执行此操作是一种不正确的方法,因为您通常不应在呈现单元格之前对其进行分析。
执行此操作的方法是让您的UITableViewCell
- 继承类保留一个(可能是嵌套的)布尔数组,指示应该扩展哪些单元格。然后,您可以使用UITableView
的{{1}}和可能IndexPath
作为此数组的索引,以确定是否扩展了单元格。像这样:
row
设置数据的正确方法是调用section
上的方法,但为了简单起见,我假设您已经在TableView上设置了数据。
请勿尝试手动设置class MyTableView: UITableView, UITableViewDelegate {
/* ... */
private var expanded: [Bool] = []
init() {
super.init()
self.delegate = self
}
func setData(data: [SomeType]) {
//set the data for the table here
expanded = [Bool](repeating: false, count: data.count)
}
/* ...logic to expand and collapse cells... */
func tableView(_ view: UITableView,
heightForRowAt indexPath: IndexPath) {
if expanded[indexPath.row] {
return expandedHeight
} else {
return collapsedHeight
}
}
/* ... */
}
的属性。设置UITableViewDataSource
的基于UITableView
和delegate
的工作流程,以便您的表格视图有效运行,并且只在需要时自行更新。