我有一个项目,必须在一个屏幕上显示很多信息。它不是太多的信息,但是实现起来很复杂。出于这个问题的目的,我建议看一下this screenshot,它将说明我想要实现的目标。
我目前使用UIViewController
设置此屏幕,其中包含一个UITableView
,其中使用自动布局作为中间部分固定到视图的顶部,底部,前导和尾随锚。这很好。然后,我添加了一个tableHeaderView
,其中包含有关用户的信息。现在,我刚刚在UITableView
中添加了第二个tableFooterView
,而且令人惊讶的是,它也像一个符咒一样工作。我在设置高度时遇到了一些麻烦,但是我设法通过viewDidLayoutSubviews()
方法来完成它。但这有点题外话。
我现在处于最后阶段,我想与UITextView
一起添加UIButton
(在UIView
容器中)以允许用户添加评论。最初,我在tableFooterView
中添加了它,然后它起作用了,但是一旦内容太短(例如,中间只有一行,还没有评论),UITextView
就会出现在屏幕中间(直接位于UITableView
的内容下方)。我仔细阅读了一下,发现它是tableFooterView
的预期行为,所以我现在试图找出一种方法来添加此自定义视图,以添加将始终的注释如果内容未填满整个屏幕,则在底部;如果内容大于屏幕大小,则也将与内容一起滚动。 (理想情况下,我希望能够在用户输入文本时增大或缩小UITextView
,在有人建议contentInsets的情况下可能是相关的。)
有什么建议吗?我是否应该将子视图直接添加到UITableView
中(据我所读,不建议这样做)?我应该在UITableView上使用contentInsets并将UIView
容器添加为主要UIViewController
的子视图吗?在没有找到正确解决方案的情况下搜索多个解决方案后,我有些失落,所以希望大家能帮帮我。干杯!
答案 0 :(得分:0)
添加UITextView
很麻烦,因为就像UIScrollView
一样,它是UITableView
的子类,并且将滚动视图添加到另一个滚动视图不仅使手势识别器难以处理,而且还可以进行自动布局。
让您的生活更轻松的是,在视图控制器中只有一个表视图,其中包含不同的节,并且每个节具有不同类型的单元格。
为此,我想在视图控制器中声明一个enum
:
class MyViewController: UIViewController {
private enum Section: Int, CaseIterable {
case foo
case bar
}
}
extension MyViewController: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return Section.allCases.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
guard let section = Section(rawValue: section) else { preconditionFailure() }
switch section {
case .foo:
return 1
case .bar:
return 4
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let section = Section(rawValue: indexPath.section) else { preconditionFailure() }
let cell: UITableViewCell
switch section {
case .foo:
cell = ...
case .bar:
cell = ...
return cell
}
}
对于具有长文本的单元格,您只需使用default
单元格样式(在XIB / storyboard中)并设置
cell.textLabel?.numberOfLines = 0
表格视图应该能够自动调整其大小以适合整个文本。
在方案中需要使用UITextView
的唯一原因是,如果您希望用户能够编辑文本。否则,可以省下很多痛苦,并选择UILabel
。
答案 1 :(得分:-1)
您应该在主屏幕底部添加单独的UIView,并将UITextView添加为其中的子视图。 在此容器视图上方添加TableView,以便其滚动,并且textview始终在底部可见。