UItableView Bottom에서 Pull To Refresh를 하고 있어요.방법
소스 코드가 있어서 그걸 쓰면 빠를 거야.
MEMO:SwipeUpTo Refresh는 위에서 아래로 당길 때 Refresh를 말합니다.
무슨 말
다음은 빨간색을 원하는 사람들을 위한 기사입니다.
환경:
소스 코드
다음:
Sample Source Code: https://github.com/ykeisuke/sample-pull-to-refresh-at-bottom
해설
기법 개요:
UIViewController
ViewController.swift
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
tableView.delegate = self
tableView.delegate = self
에서 Delegate 미리 설정ViewController.swift
extension ViewController: UITableViewDelegate {
//func scrollViewDidScroll(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
// 下部でロードをしていいか、判定する
let contentSize = scrollView.contentSize.height
let tableSize = scrollView.frame.size.height - scrollView.contentInset.top - scrollView.contentInset.bottom
let canLoadFromBottom = contentSize > tableSize
// Offset
// 差分を計算して、 `<= -120.0` で、閾値を超えていればrefreshするようにする。
let currentOffset = scrollView.contentOffset.y
let maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height
let difference = maximumOffset - currentOffset
// Indicatorをごにょる。スクロールしている可能性があったり、表示するべきであれば表示する。
if canLoadFromBottom, self.isLoadingMore == false {
indicatorFrame.isHidden = false
var indicatorDifference = difference + indicatorFrame.frame.height
indicatorDifference = indicatorDifference * CGFloat.init(-1.0)
// 一番下で固定しておくためなので
if indicatorDifference > 0 {
indicatorDifference = 0
}
indicatorBottomAlignmentConstraint.constant = indicatorDifference
indicatorFrame.layoutIfNeeded()
}
if difference == 0.0 {
indicatorFrame.isHidden = true
}
// Difference threshold as you like. -120.0 means pulling the cell up 120 points
if canLoadFromBottom, difference <= -120.0 {
// Loading中なら、もう一回ロードしないようにする。
if (self.isLoadingMore == false) {
// Save the current bottom inset
// Add 50 points to bottom inset, avoiding it from laying over the refresh control.
let previousScrollViewBottomInset = scrollView.contentInset.bottom
scrollView.contentInset.bottom = previousScrollViewBottomInset + 50
indicator.startAnimating()
indicatorBottomAlignmentConstraint.constant = 0
indicatorFrame.layoutIfNeeded()
self.isLoadingMore = true
// TODO: ここでローディング中に何かやりたい人はやればよい。↓は終わったら呼び出せば良い
// loadMoreData function call
// original:
// loadMoreDataFunction(){ result in
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + .seconds(5)) {
// Reset the bottom inset to its original value
scrollView.contentInset.bottom = previousScrollViewBottomInset
self.isLoadingMore = false
self.indicator.stopAnimating()
self.indicatorBottomAlignmentConstraint.constant = -50
}
}
}
}
}
기타
Indicator를 표시하려면 다음 위치에서 표시하거나 숨길 수 있습니다.
👇이곳은 위치를 조금 높여 유지하고 있다.
ViewController.swift
scrollView.contentInset.bottom = previousScrollViewBottomInset + 50
👇그리고 로드가 끝나면 다시 위치에 놓으세요.ViewController.swift
// Reset the bottom inset to its original value
scrollView.contentInset.bottom = previousScrollViewBottomInset
self.isLoadingMore = false
Refresh 프로세스는 다음과 같습니다.👇근처에서 하면 돼.👇"5초 후 불러오기 종료"로 설정된 샘플을 되돌려줍니다.
(처리가 끝난 후 위치를 복원하는 처리☝️이렇게 불러주시면 됩니다.
ViewController.swift
// loadMoreDataFunction(){ result in
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + .seconds(5)) {
참조: https://stackoverflow.com/questions/27190848/how-to-show-pull-to-refresh-element-at-the-bottom-of-the-uitableview-in-swift이상φ('ᴗ'」)
Reference
이 문제에 관하여(UItableView Bottom에서 Pull To Refresh를 하고 있어요.방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/YKEI_mrn/items/b6320ec82d4a9f5fcc27텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)