iOS: refreshControl большой заголовок плохо работает в UITabBarController

#ios #swift #pull-to-refresh

Вопрос:

У меня есть UIViewController с панелью навигации, которая является частью UITabController.

Внутри UIViewController у меня есть только UITableView.

Панель навигации прозрачна и размыта.

Верхнее ограничение TableView-это просмотр, поэтому, когда я прокручиваю содержимое, оно находится за панелью навигации.

У меня включены большие заголовки:

Проблема:

Данные loadData срабатывают сразу же, как только я начинаю прокручивать вниз. Сразу после того, как я прокручу несколько пикселей вниз.

Все работает нормально, если я удаляю большие заголовки, но с большими заголовками кажется, что refreshControl уже находится в положении, когда он готов к запуску .valueChanged

Также он отлично работает, если удалить панель вкладок и загрузить NavigationController непосредственно как root. Но мне нужна панель вкладок.

Полный код:

 @main
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    
        let window = UIWindow(frame: UIScreen.main.bounds)
        
        window.makeKeyAndVisible()
        self.window = window
        
        window.rootViewController = TabBarController()
        
        return true
    }
}

class TabBarController: UITabBarController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let navigationController = UINavigationController(rootViewController: ViewController())
        navigationController.navigationBar.prefersLargeTitles = true
        
        viewControllers = [navigationController]
    }
}

class ViewController: UIViewController {
    private let tableView = UITableView()
    
    private let refreshControl = UIRefreshControl()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        navigationItem.title = "Test"
        
        view.addSubview(tableView)
        tableView.snp.makeConstraints { make in
            make.edges.equalToSuperview()
        }
        
        tableView.delegate = self
        tableView.dataSource = self
        tableView.refreshControl = refreshControl
        refreshControl.addTarget(self, action: #selector(loadData), for: .valueChanged)
    }
    
    @objc func loadData() {
        print("loadData triggered")
        DispatchQueue.main.asyncAfter(deadline: .now()   3.0) {
            self.refreshControl.endRefreshing()
        }
    }
}

extension ViewController: UITableViewDataSource, UITableViewDelegate {
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        var cell: UITableViewCell
        if let defaultCell = tableView.dequeueReusableCell(withIdentifier: "defaultCell") {
            cell = defaultCell
        } else {
            cell = UITableViewCell(style: .value1, reuseIdentifier: "defaultCell")
        }
        cell.textLabel?.text = "Test"
        return cell
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        10
    }
}
 

но

Все работает нормально, если это из раскадровки: введите описание изображения здесь

Комментарии:

1. Мне кажется, что я читал ту же тему несколько часов назад.

2. @ElTomato Я опубликовал это час назад. Но затем удалил и подготовил код, чтобы было понятно, что я делаю, и подготовил код, который легко попробовать