2017-10-13 7 views
0

ユーザーがボトムをヒットしたときにテーブルビューに新しいアイテムを追加しようとしました。ここでテーブルビューの新しいアイテムをスクロールで下に移動しようとしました

私が試したものです。このように起動FUNC

/* Scrolling */ 

    func scrollViewDidScroll(_ scrollView: UIScrollView) { 

     let height = scrollView.frame.size.height 
     let contentYoffset = scrollView.contentOffset.y 
     let distanceFromBottom = scrollView.contentSize.height - contentYoffset 
     if distanceFromBottom < height { 
      self.viewModel.loadMoreCharacters() 
     } 
    } 

LoadMoreCharacters:何らかの理由で

func loadMoreCharacters(){ 

     guard isLoading.value == false else { 
      print("Already try to load items") 
      return 
     } 
     isLoading.value = true 
     print ("start load") 

isLoading.value = true 

     ApiManager.shared.getCharacters(offset: offset, limit: limit, orderBy: OrderBy.name) { [unowned self] (success, charIds) in 

      if (success){ 
       self.addItemsWithNewCharactersIds(charIds: charIds ?? []) 
       self.offset += 10 
       self.isLoading.value = false 
       print("have new") 
      } else { 
       self.isLoading.value = false 
       self.delegate?.finishLoadingWithError(error: nil) 
      } 
     } 

、そのコードは2回実行。私はそれが1回(私は要求を意味する)を実行します。

答えて

1

私は個人的にはscrollViewDidScroll代理人だけに依存しませんでした。これは、ユーザーの操作に由来しない可能性がある他のものもスクロールできるからです。 (:するCGPoint、 targetContentOffset:UnsafeMutablePointer UIScrollViewの、withVelocity)ユーザーがスクロールを終了したときに、デリゲート に指示しますあなたは多分それは

var userScrolling = false 

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    if (userScrolling) { 
     let height = scrollView.frame.size.height 
     let contentYoffset = scrollView.contentOffset.y 
     let distanceFromBottom = scrollView.contentSize.height - contentYoffset 
     if distanceFromBottom < height { 
      self.viewModel.loadMoreCharacters() 
     } 
    } 
} 

func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { 
    userScrolling = true 
} 

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { 
    userScrolling = false 
} 

FUNCのscrollViewWillEndDraggingをスクロールユーザーだったかどうかを確認するために、これらの2つのデリゲートを利用してみてくださいコンテンツ。

func scrollViewWillBeginDragging(UIScrollView) スクロールビューがコンテンツのスクロールを開始しようとしているときにデリゲートに通知します。

はそれだけで、ユーザがscrollViewWillBeginDraggingわからない、ドキュメントにscrollViewWillEndDraggingでスクロールをトリガされた1つだったことを指定します。しかし、私はxcodeでそれを試して、それは私のために働いていた。

EDIT:あなたは、ユーザーが下に非常に難しいスワイプと

すぐに行くことができた場合に scrollViewDidEndDeceleratingscrollViewWillBeginDeceleratingを見てみなければならないかもしれません
関連する問題