2015-12-29 11 views
2

iOS版Google Primer應用程序具有表格視圖滾動效果,其中滾動時單元彼此堆疊在一起。 Primer application:如果您在他們的頁面上滾動,您可以看到效果......我所說的效果在Primer的特色課程中。我想用tableview來重現它。自定義tableview滾動效果,如谷歌底漆

我試過在viewdidscroll事件上玩單元格的框架。 我得到它的工作,但以特定的方式向上移動時,它會變得非常跳動/生澀。而且,當突發事件發生時,幀會錯誤地偏移。我只能在單元格內的標籤框架上做到這一點。我的細胞真的很大(超過屏幕的一半)。

如何消除跳躍/跳動?我如何爲容器視圖位置設置動畫而不是標籤位置?

在scrollViewDidScroll目前動畫帶有標籤:

override func scrollViewDidScroll(scrollView: UIScrollView) { 
    if (self.tableView.contentOffset.y < 0) { return } 

    let offsetYDifference = oldYOffset - self.tableView.contentOffset.y 
    oldYOffset = self.tableView.contentOffset.y 

    let cell = self.tableView.visibleCells.first! 

    var newOriginY = (cell.textLabel?.frame.origin.y)! - offsetYDifference 
    if (newOriginY < 0) { //Cells get reused. 
     newOriginY = newOriginY + cell.frame.height 
    } 

    cell.textLabel?.frame = CGRect(x: (cell.textLabel?.frame.origin.x)!, 
     y: newOriginY, 
     width: (cell.textLabel?.frame.width)!, 
     height: (cell.textLabel?.frame.height)!) 
} 

Custom paging-like behavior分頁啓用設置爲關上的腳本:

override func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { 

    let offsety = targetContentOffset.memory.y 
    var smallestCellDiffToContentOffset = abs(offsety - (self.tableView.visibleCells.first?.frame.origin.y)!) 

    var closestCellOrigin = self.tableView.visibleCells.first?.frame.origin.y 

    self.tableView.visibleCells.forEach { (cell) ->() in 
     if (abs(offsety - cell.frame.origin.y) <= smallestCellDiffToContentOffset) { 
      smallestCellDiffToContentOffset = abs(offsety - cell.frame.origin.y) 
      closestCellOrigin = cell.frame.origin.y 
     } 
    } 
    targetContentOffset.memory.y = closestCellOrigin! 
} 

我是初學者迅速developper我真的很無能在做什麼。提前致謝。

回答

2

在本質上你看到的是UITableView正在抵制你的努力來創建此動畫。正確的是,改變單元格的框架應該留給tableview本身。

您需要的是帶有控制單元位置的自定義佈局對象的UICollectionView。這將是一個相當不錯的工作,但是您可以使用UITableView無法提供的更精細的紋理控制。

簽出this tutorial簡要介紹了收集視圖的自定義佈局。我推薦觀看2012年WWDC視頻Advanced Collection Views and Building Custom Layouts

+0

很好的答案! Loooks就像一個很好的解決方案。這會給我更多的控制權。謝謝。沒有想過。 – AlexB

+0

沒問題。或者,如果您希望完全模仿Primer應用程序,最好的辦法是創建自己的導航控制器,該控制器使用[UIViewController containment](https://www.objc.io/issues/1-view-controllers/遏制 - 視圖 - 控制器/)。在UITableViewCell's或UICollectionViewCell's中有UIViewControllers可能會讓人毛骨悚然,並且通常不鼓勵。對於普通視圖來說,沒關係。 –

2

嘗試使用CGAffineTransformMakeTranslation。這是一種只有視覺效果,所以它不會混淆表格視圖試圖對單元格框架做什麼。像這樣的東西(也許在viewDidScroll()):

for cell in tableView.visibleCells() { 
    let cellOffset = tableView.contentOffset.y * someMagicFormula 
    cell.transform = CGAffineTransformMakeTranslation(0.0, cellOffset) 
} 
-2

如果將使用UIScrollView,而不是UITableView功能,那麼您可以在scrollView使分頁(與添加在它的自定義視圖)與垂直彈跳效果。

否則如果你想使用UITableView,你可以使用UIScrollViewDelegate和實現這樣的東西。

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView 
        withVelocity:(CGPoint)velocity 
       targetContentOffset:(inout CGPoint *)targetOffset 
{ 
    UITableView *tableView = (UITableView*)scrollView; 
    NSIndexPath *topIndexPathAfterScrolling = [tableView indexPathForRowAtPoint:*targetContentOffset]; 
    CGRect rect = [tableView rectForRowAtIndexPath:indexPathOfTopRowAfterScrolling]; 
    targetOffset->y=rect.origin.y; 
} 

在這裏,您可以調整在特定contentOffset滾動動作:「targetOffset」

+0

這不回答這個問題。我已經有了自定義分頁。這是一個很快的問題。 – AlexB