- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个包含可变数量部分的 UITableView
。每个部分都有可变数量的单元格,每个部分都有页眉和页脚。我的 UITableView
也有一个 tableFooterView
,我希望它始终位于屏幕底部,除非表格太大而无法显示在屏幕上,然后tableFooterView
应显示在最后一部分下方。我想要完成的事情如下所示:
Example of what I want, scenario 1
Example of what I want, scenario 2
但是,目前 tableFooterView
始终位于最后一部分的正下方,因此当只有两部分时,它看起来像这样:
Example of what I currently have
我正在寻找一种方法,使其在所有可能的情况下始终保持在底部。我一直在四处寻找,因为 Apple 不支持 tableFooterView
的 AutoLayout,所以我还没有找到解决方案。类似的情况是在最后一节用 sectionFooter
替换 tableFooterView
,但我不能这样做,因为我已经有了 sectionFooters
。
有没有人可以帮助我或指出正确的方向?需要考虑的几件事:
tableFooterView
;UITableView
添加部分并向部分添加行,因此 tableFooterView 应该更新其位置我目前如何设置 tableFooterView
:
class CustomView: UITableViewDelegate, UITableViewDataSource {
var myTableFooter: UIView = {
let myTableFooter = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50))
myTableFooter.backgroundColor = .red
myTableFooter.isUserInteractionEnabled = true
return myTableFooter
}()
override init(frame: CGRect) {
super.init(frame: frame)
setupViews()
MyTableView.tableFooterView = myTableFooter
}
}
编辑:按照建议尝试了 scrollViewDidScroll
方法,但没有成功:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if(scrollView == myTableView) {
let neededHeight = myTableView.frame.height - 50 - view.safeAreaInsets.bottom
let currentHeight = myTableView.contentSize.height - 50
let heightDifference = neededHeight - currentHeight
if(heightDifference > 0) {
myTableView.tableFooterView?.transform = CGAffineTransform(translationX: 0, y: heightDifference)
}
}
}
最佳答案
一种方法是:
UIView
>=
限制在 TableView 的底部所以,tableView的“auto-height”+footer view的高度决定了container view的高度,进而决定了scroll view的.contentSize
。页脚 View 将“粘贴”到容器 View 的底部。当 ScrollView 有足够的内容时,它将“下推”页脚 View 。
例子:
这是创建它的代码。一切都是通过代码完成的……不需要 IBOutlets,所以只需创建一个新的 View Controller 并将其类分配给 PennyWiseViewController
:
//
// PennyWiseViewController.swift
//
// Created by Don Mag on 5/14/19.
//
import UIKit
final class ContentSizedTableView: UITableView {
override var contentSize:CGSize {
didSet {
invalidateIntrinsicContentSize()
}
}
override var intrinsicContentSize: CGSize {
layoutIfNeeded()
return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height)
}
}
class MyOneLabelCell: UITableViewCell {
// very simple one-label tableView cell
let theLabel: UILabel = {
let v = UILabel()
v.translatesAutoresizingMaskIntoConstraints = false
v.numberOfLines = 0
return v
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
contentView.addSubview(theLabel)
NSLayoutConstraint.activate([
theLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 8.0),
theLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -8.0),
theLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 8.0),
theLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -8.0),
])
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
class PennyWiseViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
let theContainerView: UIView = {
let v = UIView()
v.translatesAutoresizingMaskIntoConstraints = false
return v
}()
let theScrollView: UIScrollView = {
let v = UIScrollView()
v.translatesAutoresizingMaskIntoConstraints = false
return v
}()
let theTableView: ContentSizedTableView = {
let v = ContentSizedTableView()
v.translatesAutoresizingMaskIntoConstraints = false
v.isScrollEnabled = false
return v
}()
let theFooterView: UILabel = {
let v = UILabel()
v.translatesAutoresizingMaskIntoConstraints = false
v.backgroundColor = .red
v.textColor = .white
v.text = "The Footer View"
v.textAlignment = .center
return v
}()
// start with 3 sections
// selecting the row in the first section allows adding sections
// selecting the row in the second section allows deleting sections
var numSections = 3
let reuseID = "MyOneLabelCell"
override func viewDidLoad() {
super.viewDidLoad()
theTableView.dataSource = self
theTableView.delegate = self
theTableView.register(MyOneLabelCell.self, forCellReuseIdentifier: reuseID)
// add the views
view.addSubview(theScrollView)
theScrollView.addSubview(theContainerView)
theContainerView.addSubview(theTableView)
theContainerView.addSubview(theFooterView)
// this will allow the container height to be at least the height of the scroll view
// when enough content is added to the container, it will grow
let containerHeightConstraint = theContainerView.heightAnchor.constraint(equalTo: theScrollView.heightAnchor, multiplier: 1.0)
containerHeightConstraint.priority = .defaultLow
NSLayoutConstraint.activate([
// constrain scrollView to all 4 sides (safe-area)
theScrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
theScrollView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
theScrollView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
theScrollView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),
// constrain containerView to all 4 sides of scrollView
theContainerView.topAnchor.constraint(equalTo: theScrollView.topAnchor),
theContainerView.bottomAnchor.constraint(equalTo: theScrollView.bottomAnchor),
theContainerView.leadingAnchor.constraint(equalTo: theScrollView.leadingAnchor),
theContainerView.trailingAnchor.constraint(equalTo: theScrollView.trailingAnchor),
theContainerView.widthAnchor.constraint(equalTo: theScrollView.widthAnchor),
// constrain tableView to top/leading/trailing of constainerView
theTableView.topAnchor.constraint(equalTo: theContainerView.topAnchor),
theTableView.leadingAnchor.constraint(equalTo: theContainerView.leadingAnchor),
theTableView.trailingAnchor.constraint(equalTo: theContainerView.trailingAnchor),
// constrain footerView >= 20 from bottom of tableView
theFooterView.topAnchor.constraint(greaterThanOrEqualTo: theTableView.bottomAnchor, constant: 20.0),
theFooterView.leadingAnchor.constraint(equalTo: theContainerView.leadingAnchor, constant: 0.0),
theFooterView.trailingAnchor.constraint(equalTo: theContainerView.trailingAnchor, constant: 0.0),
theFooterView.bottomAnchor.constraint(equalTo: theContainerView.bottomAnchor, constant: 0.0),
theFooterView.heightAnchor.constraint(equalToConstant: 150.0),
containerHeightConstraint,
])
}
// MARK: - Table view data source
func numberOfSections(in tableView: UITableView) -> Int {
return numSections
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return section < 2 ? 1 : 2
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: reuseID, for: indexPath) as! MyOneLabelCell
switch indexPath.section {
case 0:
cell.theLabel.text = "Add a section"
case 1:
cell.theLabel.text = "Delete a section"
default:
cell.theLabel.text = "\(indexPath)"
}
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
switch indexPath.section {
case 0:
numSections += 1
tableView.reloadData()
case 1:
if numSections > 2 {
numSections -= 1
tableView.reloadData()
}
default:
print("\(indexPath) was selected")
}
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return "Section \(section) Header"
}
func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? {
return "Section \(section) Footer"
}
}
关于ios - 如何让 tableFooterView 始终位于 UITableView 的底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56132642/
我遇到了 UITableView 的奇怪行为。我已经设置了一个带有 UITableView 的 UIViewController。 UITableView 包含一个 tableHeaderView、t
我想在 UITableView 的页脚中显示 UIButton(应该与标题完全相同)。 此代码位于我的 TableViewController 的 viewDidLoad 中: UIButton *f
我添加了一个 UIButton到 UITableFooterView在 UITableView .如果我触摸了这个按钮, Action 是为tableView添加一个新的单元格(“insertRows
这是一个使用自动布局在 ScrollView 中使用 UItableview 的示例。它运作良好。但是,如果我从 UItableview 中删除 tableFooterView,UItableview
我有一个包含表格部分、单元格和 tableFooterView 的简单表格。 页脚只是一张带有阴影渐变的图片。当我滚动到底部时,我希望表格捕捉到最后一个单元格的底部,并且只在你滚动到此之外时显示阴影,
这就是我如何更改首先从 Storyboard加载的 tableFooterView: 有时我会更改 tableFooterView 并将新的 ContentSize 分配给 tableView: se
我有一个 UITableView,我向其添加了一个 tableFooterView,但出于某种原因 tableFooterView 没有出现? 我如何添加我的 tableFooterView 在重新加
我正在尝试使用 MonoDevelop (v2.8) 和 MonoTouch (v4.2.2) 开发一个小型 iPhone 应用程序。 我的主屏幕由 UITableViewController 表示,
我已成功将一些 UIButton 添加到自定义 tableFooterView 中。问题是按钮事件没有被调用。此外,相对于 UIControlStateHighlighted 的图像不会出现。有任何想
我有一个 UITableView,其内容是动态变化的,就像 FIFO 堆栈一样。单元格添加到底部并从顶部删除。 这工作得很好,我可以滚动到indexPath,这样最新的消息总是向下滚动到底部(就像聊天
我有一个 UITableView,我想在其中 dataSource 为空时显示一条消息。我通过使用以下扩展设置背景 View 的众所周知的方法来做到这一点: extension UITableView
我制作了一个自定义的 UIViewController,里面有一个 UIImageView 和一个 UIButton。在 tableView viewForFooterInSection 方法中,我返
我有一个 UITableView,其自定义页脚设置为 tableFooterView(不是 sectionFooter)。我这样做是这样的: override init(frame: CGRect)
我创建了一个像图片一样的tableView。部分和单元格之间有空间。所以空间的颜色就是tableview的默认颜色。 为了删除 tableview 上的额外行,我向 tableView?.tableF
在我的 viewDidLoad 中,我写了这段代码: UIView *footerView = [[[UIView alloc] initWithFrame:CGRectZero] autorelea
我有一个 UITableView,我正在添加从 xib 加载的 tableFooterView。 var footer = NSBundle.mainBundle().loadNibNamed("AF
我有一个带有部分页脚和表格页脚的表格。它从核心数据接收数据。当数据发生变化时,我可以毫无问题地重新加载每个数据和部分页脚,但无法重新加载 tableFooterView。 我有这样的东西: 1 2 3
我有两个按钮,我将其添加到一个表页脚中,另一个添加到表头中,我知道如何使用此代码隐藏表的页眉 View table.tableHeaderView.hidden = YES;但问题是表的顶部仍有空间。
我在 viewDidLoad 方法中设置页脚 View : UIView *fView = [[UIView alloc] initWithFrame:CGRectMake(0, 718, 239,
我在表的页脚中有一个 UIPickerView(我计划从中发出对表的“分页”样式请求 - 选择器将列出我正在导航的大型数据集的可用页面,并让用户直接跳转到数据的任何“页面”)。 我的选择器收到点击;如
我是一名优秀的程序员,十分优秀!