Pengguliran berkelanjutan antara tableView dan scrollView

Saya memiliki tampilan gulir induk dengan header uiview dan tampilan tabel. Saya mencoba memiliki perilaku serupa dengan halaman profil Twitter atau Instagram. Anda mulai menggulir tampilan gulir induk dan segera setelah header hilang ada transisi terus menerus dari tampilan gulir bergulir ke tampilan tabel bergulir tanpa harus mengangkat jari dan menggantinya pada tampilan tabel . Saat ini perilakunya agak nakal. Saya harus mengangkat jari saya dan meletakkannya pada tampilan tabel setelah offset konten tampilan gulir melewati header untuk mulai menggesek tampilan tabel.

Pengontrol Tampilan Utama

    import UIKit
    import XLPagerTabStrip

    class MainViewController: UIViewController {

        lazy var headerViewController: UIViewController = {
            let header = UIViewController()
            return header
        }()

        lazy var bottomViewControllers: BottomPageViewController = {
            let bvc = BottomPageViewController()
            return bvc
        }()

        lazy var scrollView: UIScrollView = {
            let sv = UIScrollView()
            sv.delegate = self
            sv.showsVerticalScrollIndicator = false
            sv.bounces = true
            sv.bounces = false
            return sv
        }()


    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.addSubview(scrollView)
        let f = UIScreen.main.bounds
        scrollView.frame = CGRect(x: f.minX, y: f.minY, width: f.width, height: f.height)

        add(headerViewController, to: scrollView, frame: CGRect(x: 0, y: 0, width: f.width, height: 150))
        add(bottomViewControllers, to: scrollView, frame: CGRect(x: 0, y: headerViewController.view.bounds.height, width: f.width, height: f.height))
        scrollView.contentSize = CGSize(width: f.width, height: f.height * 2)

        if let vcs = bottomViewControllers.viewControllers as? [BottomViewController] {
            for vc in vcs {
                vc.delegate = self
            }
        }
    }

}

extension MainViewController: UIScrollViewDelegate {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        guard let controllers = bottomViewControllers.viewControllers as? [BottomViewController] else { return }
        let selectedController = controllers[bottomViewControllers.currentIndex]
        if self.scrollView == scrollView {
            selectedController.tableView.isScrollEnabled = self.scrollView.contentOffset.y >= 150
            print(scrollView.contentOffset.y)
            scrollView.isScrollEnabled = !selectedController.tableView.isScrollEnabled
            bottomViewControllers.view.frame.origin.y = max(150, scrollView.contentOffset.y)
        }


    }
}

extension MainViewController: CustomScrollDelegate {
    func tableViewScroll(_ viewController: BottomViewController) {
        print(viewController.tableView.contentOffset.y)
        viewController.tableView.isScrollEnabled = viewController.tableView.contentOffset.y > 0
    }
}

Pengontrol Tampilan Bawah

import UIKit
import XLPagerTabStrip

protocol CustomScrollDelegate {
    func tableViewScroll(_ viewController: BottomViewController)
}

class BottomViewController: UITableViewController {

    var pageTitle: String?
    var pageIndex: Int = 0
    var delegate: CustomScrollDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .red
        self.tableView.isUserInteractionEnabled = false
        self.tableView.bounces = true
        self.tableView.showsVerticalScrollIndicator = true
        self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "TETST")
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "TETST", for: indexPath) as? UITableViewCell else { return UITableViewCell() }
        return cell
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1000
    }

    override func scrollViewDidScroll(_ scrollView: UIScrollView) {
        delegate?.tableViewScroll(self)
    }

    init(pageTitle: String, pageIndex: Int) {
        self.pageTitle = pageTitle
        self.pageIndex = pageIndex
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

extension BottomViewController: IndicatorInfoProvider {
    func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo {
        return IndicatorInfo.init(title: pageTitle ?? "Tab \(pageIndex)")
    }
}

person joethemow    schedule 14.12.2019    source sumber


Jawaban (1)


Anda cukup menambahkan tajuk Anda sebagai tajuk ke UITableView (bukan tajuk bagian!) dan membiarkannya bergulir bersama UITableView lainnya: Bagaimana cara menggulir header bersama dengan UITableView?

Anda juga dapat membuat tautan UITableView menjadi contentSize langsung ke tingginya sehingga UITableView itu sendiri tidak pernah bergulir sama sekali, seperti ini: Mengubah ukuran UITableView agar sesuai dengan konten

Itu semua tergantung jika Anda menambahkan baris secara dinamis dengan memberi halaman dan sebagainya seberapa rumit solusi Anda. Namun menurut saya Anda akan sering kali mencapainya hanya dengan menyiapkan header UITableView dalam mode yang benar

person Lucas van Dongen    schedule 14.12.2019
comment
Masalahnya adalah saya memiliki 2 tampilan tabel berdampingan jadi saya memerlukan tampilan terpisah untuk header global - person joethemow; 14.12.2019
comment
Ambil UIScrollView, tambahkan UIView bagian dalam, tambahkan header di atas dan kedua UITableView di bawahnya. Kemudian pantau contentSize dari kedua tampilan tabel dan tetapkan sebagai ketinggian minimum dari UITableView tersebut sebagai batasan. Sekarang UITableView yang tertinggi akan selalu mendorong UIView bagian dalam ke ketinggian yang benar dan UITableView yang terpendek akan bertambah panjang tanpa kesalahan tata letak. Beri tahu saya jika ini berhasil dan saya akan memperbarui jawabannya. - person Lucas van Dongen; 15.12.2019