2015-09-19 6 views
10

Link to the subclass of UITableViewジャンプしないでCADisplayLinkとUITableViewAutomaticDimensionを使用してスクロールしながらUITableViewで更新を行う方法は?

スクロール中にUITableViewがジャンプするのはなぜですか?私を助けることができますか?私は開始私を助ける1と受賞のため

100の後にANOTHER恵み

:-)そのcontentOffsetを設定するとともにUITableViewにいくつかの変更を実行する方法は?

これは私が私のscrollDisplayLinkを設定する方法です:

scrollDisplayLink = CADisplayLink(target: self, selector: Selector("scrollTable")) 
scrollDisplayLink?.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) 
cellForCurrentIndexPath?.hidden = true 

、その後scrollTable以内に私は物事を次のようにします。行が1-4コメントしているか、私はUITableViewAutomaticDimensionを無効にしない限り

func scrollTable() { 
    var newOffset = CGPointMake(currentContentOffset.x, currentContentOffset.y + scrollRate * 10) 

    if currentContentSize.height < frame.size.height { 
     newOffset = currentContentOffset 
    } else if newOffset.y > currentContentSize.height - frame.size.height { 
     newOffset.y = currentContentSize.height - frame.size.height 
    } else if newOffset.y < 0 { 
     newOffset = CGPointZero 
    } 

    contentOffset = newOffset 


    if coveredIndexPath != nil && coveredIndexPath! != currentIndexPath! { 

     let verticalPositionInCoveredCell = longPressGestureRecognizer.locationInView(cellForRowAtIndexPath(coveredIndexPath!)).y 

     if direction == .Down && heightForCoveredCell - verticalPositionInCoveredCell <= heightForCurrentCell/2 { 
       print("moved down") 

       beginUpdates() //1 
       moveRowAtIndexPath(currentIndexPath!, toIndexPath: coveredIndexPath!) //2 
       currentIndexPath = coveredIndexPath //3 
       endUpdates() //4 

     } 
    } 
} 

スクロールは結構です。それらがコメントされていないときには、currentContentOffsetが異なるときにテーブルがジャンプし、0がスクロールします。なぜそんなことが起こるの?スレッドや他の何かに問題はありますか?

注:

UITableViewUITableViewAutomaticDimensionで動作します:

func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

答えて

0

は明白で始まるのをしてみましょう:

のUITableViewはUIScrollViewのサブクラスであり、我々はそのいくつかのプロパティを使用することができます。

ほとんど毎年、UIScrollviewsのカスタマイズ方法に関する優れたWWDCの話があります。

彼らは、ユーザーがスクロールしている間、各フレームと呼ばれる

// is called every frame of scrolling and zooming 
override func layoutSubviews() { 
    ... 
    super.layoutSubviews() 
    ... 
} 

の内側にやるようなものを行うことを示唆しています。

私は、スクロール中にcurrentContentOffsetとサイズと座標系を混乱させるためにこの場所を頻繁に使いました(私はUIScrollViewではなくUITableViewをサブクラス化しました)。

利点:UIScrollViewのは、それが変更されることを想定して正確にいつ

  • あなたは物事を変更している、あなたのコールバックCADisplayLink
  • を使用する必要が自由のための各フレームを取得していないがcontentOffsetをタイク。

が、これは

P.S.を役に立てば幸い

私の実験によれば、UIScrollView内でスクロールされるビューは、約8000ピクセル以下にすることはできません。要するに

テーブルの割合は、一度、その後描かれているので、無限スクロールと呼ばれ、UIScrollViewsについてWWDCのビデオのいずれかに記述されている戦略を実装する必要がありのUITableViewリンゴ

表の内容を再描画せずにスクロールします。ユーザーがスクロールしすぎると、スクロールしたテーブルの別の部分が描画され、同時にcontentOffsetがUITableViewの実装によって変更されます。

これはおそらく、layoutSubviews()の実装でsuper.layoutSubviews()を呼び出すときに行われます。

関連する問題