UIKit-Swift-允许tableHeaderView向上滚动,但不能向下滚动

时间:2019-02-09 23:05:38

标签: ios swift uitableview uinavigationbar

我有一个带有导航栏和标签栏的UIViewController。除此之外,整个屏幕都由一个UITableView组成。

我有一个很大的tableHeaderView,它的背景颜色与导航栏相同。

当我向上拖动内容(向下滚动)时,一切看起来都很好。

但是如果我将其向上拖动,导航栏和标题视图之间就会出现难看的断开连接。

在向下拖动时,有什么方法可以将其锚定在顶部,而在向上拖动时可以使其滚动吗?

enter image description here

2 个答案:

答案 0 :(得分:1)

当表格视图滚动时,您可以尝试创建视图并将其放置在My JSON table: [{"name1": 10},{"name2": 20},{"name3": 30}] PHP: foreach ($datas as $data) { $offense_stat = json_decode($data['offense_stats'],true); echo ' <tr> <th scope="row">'.translatePlayerName($data['player_id']).'</th> --not relevant now <td>'.translatePositionName($data['position_id']).'</td> -- not relevant now <td>'.$offense_stat[0]->{'name1'}.'</td> <td>'.$offense_stat[1]->{'name2'}.'</td> }; 后面,视图的高度会更新。

tableView

如果您将代码复制粘贴到一个空项目中,则可以查看其行为。不要忘记将import UIKit class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { lazy var tableView : UITableView = { let tableView = UITableView(frame: .zero, style: .plain) tableView.dataSource = self tableView.delegate = self return tableView }() let backView : UIView = { let view = UIView() view.backgroundColor = .red return view }() var backViewHeight : NSLayoutConstraint? override func viewDidLoad() { super.viewDidLoad() self.title = "ViewController" self.view.addSubview(backView) backView.translatesAutoresizingMaskIntoConstraints = false backView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor).isActive = true backView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true backView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true backViewHeight = backView.heightAnchor.constraint(equalToConstant: 0) backViewHeight?.isActive = true self.view.addSubview(tableView) tableView.translatesAutoresizingMaskIntoConstraints = false tableView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor).isActive = true tableView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true tableView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true tableView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true tableView.register(Cell.self, forCellReuseIdentifier: "cell") tableView.register(Header.self, forHeaderFooterViewReuseIdentifier: "header") tableView.backgroundColor = .clear self.navigationController?.navigationBar.barTintColor = .red self.navigationController?.navigationBar.isTranslucent = false self.navigationController?.navigationBar.setValue(true, forKey: "hidesShadow") } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 3 } func scrollViewDidScroll(_ scrollView: UIScrollView) { if scrollView.contentOffset.y < 0 { backViewHeight?.constant = -scrollView.contentOffset.y } } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) return cell } func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "header") header?.contentView.backgroundColor = .red let headerLabel = UILabel(frame: CGRect(x: 0, y: 0, width: tableView.bounds.size.width, height: 100)) headerLabel.textAlignment = .center headerLabel.text = "Header" header?.addSubview(headerLabel) return header } func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return 100 } func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { let view = UIView() view.backgroundColor = .white return view } } class Cell: UITableViewCell { let label : UILabel = { let label = UILabel() label.text = "One Label" return label }() override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) self.backgroundColor = .clear setupViews() } func setupViews() { self.backgroundColor = .white self.addSubview(label) label.frame = self.frame } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } } class Header : UITableViewHeaderFooterView { override init(reuseIdentifier: String?) { super.init(reuseIdentifier: reuseIdentifier) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } } 嵌入ViewController中。希望对您有帮助

答案 1 :(得分:-1)

1)如果tableview顶部的多余空白是永久性的并且约束是正确的,那么这就是解决方案。 滚动视图插图会自动调整(如果禁用),应将其删除

if #available(iOS 11.0, *) {
    tableView.contentInsetAdjustmentBehavior = .never
} else {
    automaticallyAdjustsScrollViewInsets = false
}

2)如果您在拉下时才拿到它,它又回到了正常状态。这意味着启用了tableview弹跳功能,根据iOS文档,这是正常现象:

如果此属性的值为true,则滚动视图在遇到内容边界时会反弹。视觉上弹起表示滚动已到达内容的边缘。如果该值为false,则滚动将立即在内容边界停止而不反弹。默认值为true。

您可以在故事板或xib文件中取消选中表视图中的反弹。或者您可以使用以下代码段:

tableView.bounces = false
tableView.alwaysBounceVertical = false

注意:不建议您禁用滚动弹跳功能,因为这会使iOS感觉异常。 而且如果您想使用pull刷新它将不起作用。

所以最后,如果您选择不禁用它,则必须更改表视图的父级的背景色,然后它才能解决。

我希望这是有道理的!