gpt4 book ai didi

ios - 带有大标题导航的 UITableView UIRefreshControl 不会粘在顶部 - 它会移动

转载 作者:行者123 更新时间:2023-12-01 15:18:42 24 4
gpt4 key购买 nike

我使用了带有大标题的 UITableView.refreshControl。我试图模仿 native 邮件应用程序使用拉动刷新的方式。对我来说,刷新控件会移动并且不会像邮件应用程序那样停留在屏幕顶部。这是一个游乐场:

//: A UIKit based Playground for presenting user interface
import UIKit
import PlaygroundSupport
class ViewController: UIViewController {
public init() {
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private lazy var refresh: UIRefreshControl = {
let refreshControl = UIRefreshControl()
refreshControl.backgroundColor = .clear
refreshControl.tintColor = .black
refreshControl.addTarget(self, action: #selector(refreshIt), for: .valueChanged)
return refreshControl
}()
private lazy var tableView: UITableView = {
let tableView = UITableView()
tableView.translatesAutoresizingMaskIntoConstraints = false
tableView.refreshControl = refresh
tableView.delegate = self
tableView.dataSource = self
return tableView
}()
private var data: [Int] = [1,2,3,4,5]

override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
// Add tableview
addTableView()

navigationController?.navigationBar.prefersLargeTitles = true
navigationItem.title = "View Controller"
}
private func addTableView() {
view.addSubview(tableView)
NSLayoutConstraint.activate([
tableView.leftAnchor.constraint(equalTo: view.leftAnchor),
tableView.rightAnchor.constraint(equalTo: view.rightAnchor),
tableView.topAnchor.constraint(equalTo: view.topAnchor),
tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
])
}
@objc func refreshIt(_ sender: Any) {
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
self.refresh.endRefreshing()
self.data = [6,7,8,9,10]
self.tableView.reloadData()
}
}
}
extension ViewController: UITableViewDelegate, UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.data.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell()
cell.textLabel?.text = "Row \(data[indexPath.row])"
return cell
}
}
let vc = ViewController()

let nav = UINavigationController(rootViewController: vc)

// Present the view controller in the Live View window
PlaygroundPage.current.liveView = nav


我怎样才能让微调器粘在顶部,并让它像邮件应用程序一样运行?此外,导航标题会做这件奇怪的事情,它比表数据向后移动的速度慢,并导致发生一些重叠......感谢任何帮助!

编辑 2020 年 6 月 7 日

我转而使用可修复重叠动画的 diffable 数据源,但是,当触觉反馈发生并导致微调器向上和向下射击时,仍然存在这种奇怪的故障,所以我原来的问题仍然存在 - 怎么做我们让微调器像邮件应用程序一样保持固定在顶部。感谢您查看这个独特的问题 :)!!!

最佳答案

原因是在用reloadData它同步删除和重建所有内容,从而打破结束刷新动画。

可能的解决方案是给时间结束动画,然后才执行重新加载数据。

使用 Xcode 11.4/Playground 测试

demo

修改后的代码:

@objc func refreshIt(_ sender: Any) {
// simulate loading
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
self.refresh.endRefreshing() // << animating

// simulate data update
self.data = [6,7,8,9,10]

// forcefully synchronous, so delay a bit
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.tableView.reloadData()
}
}
}

如果您知道修改过的数据结构,另一种方法是使用 beginUpdate/endUpdate一对

demo2
@objc func refreshIt(_ sender: Any) {
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
self.refresh.endRefreshing()
self.data = [6,7,8,9,10]

// more fluent, but requires knowledge of what is modified,
// in this demo it is simple - first section
self.tableView.beginUpdates()
self.tableView.reloadSections(IndexSet([0]), with: .automatic)
self.tableView.endUpdates()
}
}

关于ios - 带有大标题导航的 UITableView UIRefreshControl 不会粘在顶部 - 它会移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62172852/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com