UIKit - Swift - Разрешить tableHeaderView прокручивать вверх, но не вниз - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть UIViewController с панелью навигации и панелью вкладок.Помимо этого, весь экран состоит из UITableView.

У меня большой tableHeaderView, который имеет тот же цвет фона, что и панель навигации.

Когда я перетаскиваю контент вверх (прокручивая), все выглядит нормально.

Но если я перетаскиваю его вверх, между панелью навигации и видом заголовка возникает отвратительное разъединение.

Есть ли способ привязать его к вершине при перетаскивании вниз, позволяяэто прокручивать при перетаскивании вверх?

enter image description here

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Вы можете попытаться создать представление и поместить его за 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 в NavigationController.Надеюсь, это поможет

0 голосов
/ 10 февраля 2019

1) Если нежелательный пробел в верхней части табличного представления является постоянным и ограничения правильные, это решение.вставки вида прокрутки, настроенные автоматически, если вы отключите его, следует удалить его

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

2), если он у вас есть, когда вы нажимаете, и он возвращается в свое нормальное состояние.Это означает, что отскок в виде таблицы включен, и это нормальное поведение в соответствии с документацией iOS:

Если значение этого свойства равно true, представление прокрутки отскакивает, когда оно сталкивается с границей содержимого.Визуальный отскок означает, что прокрутка достигла края контента.Если значение равно false, прокрутка немедленно останавливается на границе содержимого без отскока.Значение по умолчанию - true.

. Вы можете снять отметку с подпрыгивания в виде таблицы в раскадровке или в файле xib.Или вы можете использовать этот фрагмент:

tableView.bounces = false
tableView.alwaysBounceVertical = false

Примечание: , которое не рекомендуется отключать отскок прокрутки, так как это может привести к неестественности в iOS.а также, если вы хотите использовать pull для обновления, он не будет работать.

Итак, наконец, если вы решите не отключать его, вам придется изменить цвет фона родителя вашего табличного представления, и он решит его.

Надеюсь, это имеет смысл!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...