2012-09-04 36 views
5

我想在UITableView中實現對自定義大小頁面的分頁。 我想要實現的是讓活動單元格的頂部與tableView頂部的 對齊,同時仍然在tableView底部顯示下一個單元格的頂部(以使用戶滾動並查看更多內容細胞)。與自定義類似分頁行爲的UITableView

我的細胞都是相同的高度。

如果我設置了paging=YES這會導致略微偏移,這會隨着我在頁面中的滑動而增加。這是由於我的tableView比一個單元格稍高,單元格高度/頁面大小沒有對齊。

我試過啓用分頁的不同事情。我嘗試將tableView的大小設置爲單元格的高度,但是關閉剪切和遮罩,以便用戶仍然可以看到下一個單元格。這不起作用,因爲在單元格滾動到tableView的邊界框之前的最後一個ms,下一個單元格僅添加到底層的scrollView。

然後我開始實現不同的scrollView委託方法來模仿分頁行爲 - 我似乎無法做到正確。

我有,除其他事項外,試過這樣的事情:

- (void) scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset 
{ 
    float cellHeight = [myCell rowHeight]; 
    int index = floorf(scrollView.contentOffset.y/cellHeight); 

    *targetContentOffset = CGPointMake(targetContentOffset->x, targetContentOffset->y = (index * cellHeight)); 
} 

雖然它像是做了正確的事情,它的行爲完全不像一個滾動視圖/的tableView分頁功能。

我在這裏發現了一些試圖實現同樣目標的人的帖子,但答案遭受了與我自己嘗試的任何事情相同的「非本機快感」。

感謝您給予的任何幫助。

的iOS> = 5.0

+0

你讓它工作? – aqs

+0

@aqs對不起,它從來沒有真正的工作,足以構成分頁。 – RickiG

+0

沒關係。我把這個https://github.com/100grams/HGPageScrollView並修改爲垂直滾動。服務我的目的 – aqs

回答

3

如果關閉分頁可以使用UIScrollView委託功能:

-(void)scrollViewWillEndDragging:(UIScrollView*)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint*)targetContentOffset { 

    // Get index path for target row 
    NSIndexPath* indexPath = [self.tableView indexPathForRowAtPoint:(*targetContentOffset)]; 

    // Set new target 
    (*targetContentOffset) = [self.tableView rectForRowAtIndexPath:indexPath].origin; 

} 
11

實施scrollViewWillEndDragging:withVelocity:targetContentOffset:返回頂部targetContentOffset小區最接近的座標,而不是最接近你的起點抵消。 jjv360提供的解決方案做得很好,但您可能需要稍微調整一下,具體取決於您的單元格的平均高度(jjv360的解決方案可能對真正的大單元格太過敏捷)。

我只想補充一點,你可以讓UITableView的減速更快更象通過改變其decelerationRate財產分頁UIScrollView(只是做一次,到了init/viewDidLoad中/地方)。

self.tableView.decelerationRate = UIScrollViewDecelerationRateFast; 
+0

謝謝菲利普,我現在就試試看。當使用本機行爲進行分頁時,不能跳轉多個頁面,這很令人興奮,如果我將端點限制在targetContentOffset中,會發生什麼情況 - 它只需要是下一個或前一個單元格。 decelerationRate - 我以前沒見過,真棒:) – RickiG

+0

看起來像在啓用分頁時,decelerationRate不起作用。無論如何,感謝您指出這個API :) – Tomasz

1

我解決了這個問題,此代碼:

- (void) scrollViewWillBeginDragging:(UIScrollView *)scrollView { 

    CGFloat pageWidth = self.collectionView.frame.size.width + 10 /* Optional Photo app like gap between images */; 

    _currentPage = floor((self.collectionView.contentOffset.x - pageWidth/2)/pageWidth) + 1; 

    NSLog(@"Dragging - You are now on page %i", _currentPage); 
} 

-(void) scrollViewWillEndDragging:(UIScrollView*)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint*)targetContentOffset { 

    CGFloat pageWidth = self.collectionView.frame.size.width + 10; 

    int newPage = _currentPage; 

    if (velocity.x == 0) // slow dragging not lifting finger 
    { 
     newPage = floor((targetContentOffset->x - pageWidth/2)/pageWidth) + 1; 
    } 
    else 
    { 
     newPage = velocity.x > 0 ? _currentPage + 1 : _currentPage - 1; 

     if (newPage < 0) 
      newPage = 0; 
     if (newPage > self.collectionView.contentSize.width/pageWidth) 
      newPage = ceil(self.collectionView.contentSize.width/pageWidth) - 1.0; 
    } 

    NSLog(@"Dragging - You will be on %i page (from page %i)", newPage, _currentPage); 

    *targetContentOffset = CGPointMake(newPage * pageWidth, targetContentOffset->y); 
} 

感謝http://www.mysamplecode.com/2012/12/ios-scrollview-example-with-paging.html指點正確的方式。