2011-10-12 46 views
6

我想通過點擊按鈕以編程方式滾動UITableView。在手動或滾動時間方面應該達到相同的效果。以編程方式滾動UITableView加速和減速

首先我嘗試使用scrollToRowAtIndexPath:atScrollPosition:animated:但是它太快並且及時修復。它也沒有任何加速和減速。

任何想法如何以編程方式滾動UITableView,因爲它已被手動滾動?我正在考慮發送一些自定義觸摸它。你認爲它可以工作嗎?

任何想法和幫助,非常感謝!謝謝!

回答

9

UITableview是UIScrollview的子類。像UIScrollview一樣,您可以通過設置contentOffset屬性以編程方式設置UITableview的滾動位置。

您可以在動畫塊內更改此屬性值,以便在時間上有更多的控制權。你需要計算Y點位置。假設你想滾動到第50行,它可能是50 * rowHeight(假設它是統一的高度)。

例如:

CGFloat calculatedPosY = 50 * rowHeight // do you own calculation of where you'd like it. 
[UIView animateWithDuration:0.2 
    animations:^{theTableview.contentOffset = CGPointMake(0.0, calculatedPosY);} 
    completion:^(BOOL finished){ }]; 

有,你可以使用提供了更多的選擇,以及

看看這種方法的另一種方法:

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion 
+1

謝謝!不過,我已經試過了。問題是表視圖的單元格未被加載。 –

+0

聽起來像是別的什麼問題。也許在動畫完成w/contentOffset之後,可以通過方法「indexPathsForVisibleRows」向tableview查詢其可見行。然後調用reloadRowsAtIndexPaths:withRowAnimation:使用這些可見的索引路徑。但我認爲手頭可能存在更高層次的問題。 –

2

好,這些都只是幾個「我的頭頂回答」,但你可以嘗試使用這種方法(在UIScrollView,其中UITableView是一個子類):

-(void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated 

一旦-(CGRect) rectForRowAtIndexPath:爲您提供了單元格的座標,那麼您可以動畫到單元格的位置。但不是一次調用它,而是用一個較小的偏移量來調用它幾次,然後使用更大和更大的偏移量,然後再次調用更小的偏移量。不過,我擔心這很難讓它看起來流暢。

不過,如果這樣做不起作用,可能會改變塊內的contentOffset值。也許如果你使用UIViewAnimationOptionCurveEaseInOut,你可以得到你想調用它的效果一次。如果不是這樣,請在每一部分路徑上運行幾個動畫,並在放慢速度之前覆蓋更遠更遠的距離。

+0

謝謝!我試過了。然而,tableView的內容並未以這種方式加載。我真的不敢相信這麼做很難。 –

6

在單元格子視圖中設置按鈕,並使用此代碼以編程方式在按鈕的觸摸事件上滾動表格。如果您沒有將按鈕設置爲表格單元格的子視圖,則根據需要修改此代碼。

CGPoint point = [button.superview convertPoint:button.frame.origin toView:self.tableView]; 
    CGPoint contentOffset = self.tableView.contentOffset; 
    contentOffset.y += (point.y - contentOffset.y - self.navigationController.navigationBar.frame.size.height); // Adjust this value as you need 
    [self.tableView setContentOffset:contentOffset animated:YES];