2012-05-05 32 views
2

我有UITableView包含許多單元格。用戶可以擴展電池看到通過推該小區更多的內容在此單元格(僅1個單元可以在時間展開)展開按鈕:
iOS - indexPathForRowAtPoint不返回正確的索引路徑與不同的單元格高度

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if(selectedRowIndex == indexPath.row) return 205; 
    else return 60; 
} 

在故事板,我拖累UILongPressGesture到單元格按鈕,並把它命名爲長按(細胞是自定義,它有在它2個按鈕,1只需要認識LongPressGesture,其他擴展單元高度):

@property (retain, nonatomic) IBOutlet UILongPressGestureRecognizer *longPress; 

而在viewDidLoad中:

- (void)viewDidLoad 
{  
    [longPress addTarget:self action:@selector(handleLongPress:)]; 
} 

它的工作完美,但是當我用下面的代碼來識別細胞indexPath,這是錯誤的,當一個細胞擴展:

- (void)handleLongPress:(UILongPressGestureRecognizer*)sender {   
    // Get index path 
    slidePickerPoint = [sender locationInView:self.tableView]; 
    NSIndexPath *indexPath= [self.tableView indexPathForRowAtPoint:slidePickerPoint]; 
    // It's wrong when 1 cell is expand and the cell's button I hold is below the expand button 
} 

任何人都可以請告訴我如何得到正確的indexPath時,有很不同的單元格高度?
預先感謝

+0

請添加一些代碼對你是如何加入'UILongPressGestureRecognizer'和你是如何處理的細胞的擴增,否則你不會得到很好的答案。 – tipycalFlow

+0

謝謝。我已更新我的問題 – Dranix

回答

6

這樣做的一種方法是將UILongPressGestureRecognizer添加到每個UITableViewCell(都使用相同的選擇器),然後當調用選擇器時,可以通過sender.view獲取單元格。也許不是最有效的內存,但是如果單個手勢識別器在某些情況下不會返回正確的行,這種方式應該可以工作。

事情是這樣的:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    ... 

    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] 
    initWithTarget:self action:@selector(handleLongPress:)]; 
    [longPress setMinimumPressDuration:2.0]; 
    [cell addGestureRecognizer:longPress]; 
    [longPress release]; 

    return cell; 
} 

然後

- (void)handleLongPress:(UILongPressGestureRecognizer*)sender { 
    UITableViewCell *selectedCell = sender.view; 
} 
0

首先長按手勢識別器添加到表視圖:

UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] 
    initWithTarget:self action:@selector(handleLongPress:)]; 
lpgr.minimumPressDuration = 2.0; //seconds 
lpgr.delegate = self; 
[self.myTableView addGestureRecognizer:lpgr]; 
[lpgr release]; 
的手勢處理機

然後:

-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer 
{ 
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) 
    { 
    CGPoint p = [gestureRecognizer locationInView:self.myTableView]; 

    NSIndexPath *indexPath = [self.myTableView indexPathForRowAtPoint:p]; 
    if (indexPath == nil) 
     NSLog(@"long press on table view but not on a row"); 
    else 
     NSLog(@"long press on table view at row %d", indexPath.row); 
    } 
} 

你必須要小心這使它不會干擾用戶正常敲擊單元格,還要注意handleLongPress可能會在用戶擡起手指之前觸發多次。

謝謝......!

+0

本教程不涉及UIGestureRecognizer,這是他想用來檢測長按。似乎沒有解決他的問題。 – Joel

+0

不好的答案..... – tipycalFlow

+0

它只是我的想象,或者是你的答案*完全相同,他的當前代碼(它不適用於擴展單元格)? – Joel

相關問題