是改变表的高度改变其包含良好的做法?



我有一个不可滚动的TableView。我想让它的高度由元素的个数决定。为了使这项工作,我在代码中使用了TableView的高度约束(= CGFloat(data.count) * TableView .rowheight)。这是好的做法吗?

我注意到当我删除TableView的最后一行时,它或多或少会跳过动画。这是因为表的高度调整速度比动画需要的要快吗?我该如何解决这个问题?


var data = [1,2,3,4,5,6,7,8,9,10]
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var tableViewHeight: NSLayoutConstraint!

override func viewDidLoad() {
super.viewDidLoad()
tableView.rowHeight = 50
tableViewHeight.constant = CGFloat(data.count) * tableView.rowHeight
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = "(data[indexPath.row])"
return cell
}

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
data.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .automatic)
self.tableViewHeight.constant = CGFloat(self.data.count) * self.tableView.rowHeight
}
}

override func setEditing(_ editing: Bool, animated: Bool) {
super.setEditing(!isEditing, animated: true)
tableView.setEditing(!tableView.isEditing, animated: true)
}
}

我注意的事情,以避免你所面临的问题,

  • 尽量避免使用任何常量或值。
  • 使用constraints并尝试在一个地方(StoryBoard, Xib或代码)定义它。

由于其高度由其内容附着在屏幕边缘决定,因此无法工作。

对于您的查询,

  • 尝试检查故事板和代码中是否出现任何冲突的约束。就像如果整个tableview都在故事板中定义,为什么tableView.rowHeight = 50不保留在那里呢?
  • 删除时,tableView.deleteRows().autometic动画。根据文件,case automatic = 100 // available in iOS 5.0. chooses an appropriate animation style for you。让我们将其设置为.none

请检查下面审查的代码片段是否有效。

var data = [1,2,3,4,5,6,7,8,9,10]
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var tableViewHeight: NSLayoutConstraint!

override func viewDidLoad() {
super.viewDidLoad()
tableView.rowHeight = 50
tableViewHeight.constant = CGFloat(data.count) * tableView.rowHeight
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
self.tableViewHeight.constant = CGFloat(self.data.count) * self.tableView.rowHeight
return data.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = "(data[indexPath.row])"
return cell
}

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
// I think this is causing the problem. 
if editingStyle == .delete {
data.remove(at: indexPath.row)
// use no animation
tableView.deleteRows(at: [indexPath], with: .none)
// wont update the constraint here.
// self.tableViewHeight.constant = CGFloat(self.data.count) * self.tableView.rowHeight
}
}

override func setEditing(_ editing: Bool, animated: Bool) {
super.setEditing(!isEditing, animated: true)
tableView.setEditing(!tableView.isEditing, animated: true)
}
}

如果还没有,也要检查这些

  • 动态UITableView高度
  • 动态改变UITableView高度

相关内容

  • 没有找到相关文章

最新更新