开启prefersLargeTitles后UIRefreshControl触发异常问题排查
问题原因及解决方法
你的问题出在tableView的顶部约束设置错误上。开启大标题时,导航栏会有动态高度变化,而你把tableView的top锚点直接绑定到view.topAnchor,导致tableView顶部被导航栏遮挡,下拉时refreshControl的触发阈值被错误计算,所以一拉就触发刷新。
解决方法很简单,将tableView的顶部约束从view.topAnchor改为view.safeAreaLayoutGuide.topAnchor,让tableView自动避开导航栏和状态栏区域,refreshControl的触发逻辑就能恢复正常。
修改后的setupTableView方法代码:
func setupTableView() { tableView.refreshControl = refreshControl view.addSubview(tableView) tableView.translatesAutoresizingMaskIntoConstraints = false // 替换为safeArea的top锚点 tableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true tableView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true tableView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true }
补充说明:如果需要tableView延伸到导航栏下方(比如导航栏透明场景),可以保留原top约束,但需确保设置tableView.contentInsetAdjustmentBehavior = .automatic(这是默认值,纯代码创建时偶尔需要显式声明),不过多数场景下使用safeArea约束更稳妥,能适配不同导航栏状态。
内容的提问来源于stack exchange,提问作者user17888013
相关产品推荐
相关产品推荐

