2015-09-19 44 views
10

Link to the subclass of UITableView如何使用CADisplayLink和UITableViewAutomaticDimension在不跳轉的情況下滾動時在UITableView上執行更新?

爲什麼UITableView在滾動時跳轉?你能幫我嗎?

爲一個誰幫助我,我開始和獎勵後ANOTHER賞金100 :-)

如何使用設置其contentOffset一起執行上UITableView一些變化?

這是我建立了我的scrollDisplayLink

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

,然後內scrollTable我以下的事情:

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 

     } 
    } 
} 

滾動是好的,除非線1-4被註釋掉或停用UITableViewAutomaticDimension。當它們未被評論時,當滾動時,currentContentOffset不同,然後0表跳躍。爲什麼會發生這種情況?線程還是其他問題?

注:

UITableView工作原理與UITableViewAutomaticDimension

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)。

優點:

  • 你得到你的回調每一幀免費,無需使用CADisplayLink
  • 你改變的東西題刻contentOffset什麼時候的的UIScrollView希望它被改變。

希望這有助於

附:

根據我的實驗,在UIScrollView中滾動的視圖不能高於8000像素左右。

所以蘋果的UITableView必須實現一個名爲無限滾動和數量約UIScrollViews的WWDC影片在描述策略:

簡稱:

表中的一小部分被抽一次,然後滾動而不重繪表格內容。當用戶滾動得太遠時,會繪製滾動表的不同部分,同時contentOffset會由UITableView實現更改。

這可能是在layoutSubviews()的實現中調用super.layoutSubviews()時完成的。

相關問題