UItableView Bottom에서 Pull To Refresh를 하고 있어요.방법

12464 단어 SwiftiOS
Swift, TableView 등의 ScrollView, Swipe UpTo Refresh로 만든 방법의 노트.
소스 코드가 있어서 그걸 쓰면 빠를 거야.
MEMO:SwipeUpTo Refresh는 위에서 아래로 당길 때 Refresh를 말합니다.

무슨 말


다음은 빨간색을 원하는 사람들을 위한 기사입니다.

환경:

  • Swift4.2
  • Xcode10.0
  • 소스 코드


    다음:
    Sample Source Code: https://github.com/ykeisuke/sample-pull-to-refresh-at-bottom

    해설


    기법 개요:
  • 감지 스크롤
  • 맨 아래로 내려가면 인디케이터
  • 좀 볼게요.
  • 임계값을 초과하면 Refresh가 시작됩니다.(Indicator를 맨 아래로 고정
  • Indicator 위치는 Constraint 변경 사항에 해당합니다.

     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
    이상φ('ᴗ'」)

    좋은 웹페이지 즐겨찾기