2012-06-17 84 views
15

我已經創建了一個自定義UITableViewCell一個UITableView其中的UITableViewCell的一部分。我的小區左側有一個UIImageView,右側有UITextView我怎麼能區分已被點擊

裏面UITableViewController,我都設置圖像和文本的tableview cellForRowAtIndexPath

一切都顯示正常,但現在我需要實施didSelectRowAtIndex,我需要區分單元格的UIImageViewUITextView是否已被點擊。

比方說,像點擊是代表刪除動作和單元格編輯操作的其餘部分。

回答

48

而不是增加的手勢識別器到每個單獨的小區,則可以添加一個到表視圖,確定從用戶觸摸的點被選擇哪個小區,然後確定用戶是否觸摸了圖像或細胞。

首先確保你的控制器採用UIGestureRecognizerDelegate協議。

@interface MyTableViewController() <UIGestureRecognizerDelegate> 
@end 

然後添加UIGestureRecognizerUITableView當視圖負載。

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; 
    singleTap.delegate = self; 
    singleTap.numberOfTapsRequired = 1; 
    singleTap.numberOfTouchesRequired = 1; 
    [self.tableView addGestureRecognizer:singleTap]; 
} 

該代表方法確定是否應該執行handleTap:方法。如果它可以從用戶touch中找到indexPath,則它返回YES,否則返回NO

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 
{ 
    UITableView *tableView = (UITableView *)gestureRecognizer.view; 
    CGPoint p = [gestureRecognizer locationInView:gestureRecognizer.view]; 
    if ([tableView indexPathForRowAtPoint:p]) { 
     return YES; 
    } 
    return NO; 
} 

一旦如果用戶已經點擊在細胞中我們已確定,則handleTap:方法被調用,然後決定是否用戶觸摸的圖像,或細胞的任何其他部分。

- (void)handleTap:(UITapGestureRecognizer *)tap 
{ 
    if (UIGestureRecognizerStateEnded == tap.state) { 
     UITableView *tableView = (UITableView *)tap.view; 
     CGPoint p = [tap locationInView:tap.view]; 
     NSIndexPath* indexPath = [tableView indexPathForRowAtPoint:p]; 
     [tableView deselectRowAtIndexPath:indexPath animated:NO]; 
     UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
     CGPoint pointInCell = [tap locationInView:cell]; 
     if (CGRectContainsPoint(cell.imageView.frame, pointInCell)) { 
      // user tapped image 
     } else { 
      // user tapped cell 
     } 
    } 
} 
+0

對於那些不知道。 'viewDidLoad'中的所有'UITapGestureRecognizer'設置也可以在Xcode UI佈局(又名IB)中完成。你需要將'handleTap:'的返回類型改爲'IBAction'。 – ThomasW

1

一個非常抽象的,一般的答案是做到以下幾點 對於每個UIImage的和的UILabel您添加設置它們的標籤是indexPath.row

//When creating the label and image add a recognizer to them 
label.tag = indexPath.row; 
imageView.tag = indexPath.row; 

然後添加一個UITapGestureRecognizer每個圖像和標籤上,像這樣

UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self 
                       action:@selector(handleTap:)]; 
    [label addGestureRecognizer:recognizer]; 
    [imageView addGestureRecognizer:recognizer]; 
} 

- (void) handleTap:(UITapGestureRecognizer*)recognizer 
{ 
    UIView *view = recognizer.view; 
    int row = view.tag; 
    if ([view isKindOfClass:[UILabel class]]) { 
     //Row is row 
     //and the label is pressed 
    } 

    if ([view isKindOfClass:[UIImageView class]]) { 
     //Row is row 
     //and the imageview is pressed 
    } 
} 
5

您可以繼承UITableViewCell並覆蓋touchesEnded

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 

    [super touchesEnded:touches withEvent:event]; 

    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInView:self]; 

    UIView *hitView = [self hitTest:location withEvent:event]; 

    if (hitView == myImageView) ...; 
    if (hitView == myTextView) ...; 
} 

你需要保持一定的參考您的UIImageViewUITextView(他們可能應該是你的電池的特性)。

您當然可以覆蓋touchesBegan而不是touchesEnded,這取決於您想實現的功能。

0

你有兩個選項是實現: - 1 - 添加UITapGestureRecognizer在你的「的UITableViewCell」,使之指向圖像視圖 並通過「indexpath」作爲參數來選擇器,使代表它傳遞給tableviewcell

UILabel *label = =[UILabel alloc]init]; 
label.userInteractionEnabled = YES; 
UITapGestureRecognizer *tapGesture = 
[[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelTap)]  autorelease]; 
[label addGestureRecognizer:tapGesture]; 


-(void)labelTap{ 
[delegate [email protected](labeltapped:)withobject:indexpath]; 
} 

2-二方法是檢查類型[imageview的或標號]的didSelectRowAtIndexPath方法的發送方; 但我更喜歡第一種方式

1

充分利用圖像的UIButton。當按鈕的動作被觸發時,您知道用戶點擊了圖片(單元格不會被選中)。如果選中了單元格,則知道該用戶在該行的其他位置點擊(包括文本視圖或標籤)。

另外,將按鈕的標籤屬性設置爲例如單元格的行索引,以便您可以知道哪個行的圖像被點擊。

+0

但因爲它是,這種不處理刷卡,如果這是你在找什麼? –

相關問題