xcode 如何从后台线程缓慢地上下滚动我的表视图?

cnwbcb6i  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(90)

我正试图弄清楚如何通过xcode/swift中的后台线程滚动我的tableview。下面是我目前拥有的代码:

func startBackgroundScrollingThread() {
    DispatchQueue.global(qos: .background).async {
        while self.scrollingMode {
            for row in 0..<self.list.count {
                DispatchQueue.main.async {
                    if self.scrollingMode {
                        Thread.sleep(forTimeInterval: 0.2)
                        let indexPath = IndexPath(row: row, section: 0)
                        self.tableView.scrollToRow(at: indexPath, at: .none, animated: true)
                    }
                }
                
                Thread.sleep(forTimeInterval: 0.2)
            }
            
            for row in (0..<self.list.count).reversed() {
                DispatchQueue.main.async {
                    if self.scrollingMode {
                        Thread.sleep(forTimeInterval: 0.2)
                        let indexPath = IndexPath(row: row, section: 0)
                        self.tableView.scrollToRow(at: indexPath, at: .none, animated: true)
                    }
                }
                Thread.sleep(forTimeInterval: 0.5)
            }
        }
    }
}

字符串
这段代码有点工作,但它不是一个平滑的滚动。这是非常janky。我最理想的是希望它慢慢地沿着视图走下去,然后一遍又一遍地向上备份。我感谢任何帮助!

lvjbypge

lvjbypge1#

注解此行

Thread.sleep(forTimeInterval: 0.2)

字符串
DispatchQueue.main.async内部,因为它使主线程睡眠一段时间,但您只需要使后台线程只做t睡眠

**编辑:**不使用scrollToRow可以想到contentOffset

struct Country {
    var isoCode: String
    var name: String
}

class CountriesTableViewController: UITableViewController {
    var scrollingMode = true
    let countries = [
        Country(isoCode: "at", name: "Austria"),
        Country(isoCode: "be", name: "Belgium"),
        Country(isoCode: "de", name: "Germany"),
        Country(isoCode: "el", name: "Greece"),
        Country(isoCode: "fr", name: "France"),
        Country(isoCode: "at", name: "Austria"),
        Country(isoCode: "be", name: "Belgium"),
        Country(isoCode: "de", name: "Germany"),
        Country(isoCode: "el", name: "Greece"),
        Country(isoCode: "fr", name: "France"),
        Country(isoCode: "at", name: "Austria"),
        Country(isoCode: "be", name: "Belgium"),
        Country(isoCode: "de", name: "Germany"),
        Country(isoCode: "el", name: "Greece"),
        Country(isoCode: "fr", name: "France"),
        Country(isoCode: "at", name: "Austria"),
        Country(isoCode: "be", name: "Belgium"),
        Country(isoCode: "de", name: "Germany"),
        Country(isoCode: "el", name: "Greece"),
        Country(isoCode: "fr", name: "France"),
        Country(isoCode: "at", name: "Austria"),
        Country(isoCode: "be", name: "Belgium"),
        Country(isoCode: "de", name: "Germany"),
        Country(isoCode: "el", name: "Greece"),
        Country(isoCode: "fr", name: "France"),
        Country(isoCode: "at", name: "Austria"),
        Country(isoCode: "be", name: "Belgium"),
        Country(isoCode: "de", name: "Germany"),
        Country(isoCode: "el", name: "Greece"),
        Country(isoCode: "fr", name: "France"),
        Country(isoCode: "at", name: "Austria"),
        Country(isoCode: "be", name: "Belgium"),
        Country(isoCode: "de", name: "Germany"),
        Country(isoCode: "el", name: "Greece"),
        Country(isoCode: "fr", name: "France"),
        Country(isoCode: "at", name: "Austria"),
        Country(isoCode: "be", name: "Belgium"),
        Country(isoCode: "de", name: "Germany"),
        Country(isoCode: "el", name: "Greece"),
        Country(isoCode: "fr", name: "France"),
        Country(isoCode: "at", name: "Austria"),
        Country(isoCode: "be", name: "Belgium"),
        Country(isoCode: "de", name: "Germany"),
        Country(isoCode: "el", name: "Greece"),
        Country(isoCode: "fr", name: "France"),
    ]

    // MARK: - Table view data source
    
    var height:CGFloat = 40
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
            self.startBackgroundScrollingThread()
        }
    }
    
    func startBackgroundScrollingThread() {
        let max = self.tableView.contentSize.height - self.tableView.frame.height
        DispatchQueue.global(qos: .background).async {
            while self.scrollingMode && self.height < max {
                DispatchQueue.main.async {
                    //Thread.sleep(forTimeInterval: 0.2)
                    self.tableView.contentOffset = CGPoint(x: self.tableView.contentOffset.x, y: self.height)
                    self.height += 5
                    print(self.height)
                }
                Thread.sleep(forTimeInterval: 0.2)
            }
            
            while self.scrollingMode && self.height >= 0 {
                DispatchQueue.main.async {
                    //Thread.sleep(forTimeInterval: 0.2)
                    self.tableView.contentOffset = CGPoint(x: self.tableView.contentOffset.x, y: self.height)
                    self.height -= 5
                    print(self.height)
                }
                Thread.sleep(forTimeInterval: 0.2)
            }
        }
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        self.countries.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CountryCell", for: indexPath)

        let country = self.countries[indexPath.row]
        cell.textLabel?.text = country.name
        cell.detailTextLabel?.text = country.isoCode
        cell.imageView?.image = UIImage(named: country.isoCode)

        return cell
    }

    override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        "Countries"
    }
}

相关问题