【问题标题】:How to find when a tableView cell is touched or pinched in iphone?如何在 iphone 中查找 tableView 单元格何时被触摸或捏合?
【发布时间】:2012-01-05 12:03:05
【问题描述】:

我有一个 tableView 已完成填充视图。当我点击单元格 tableView:didSelectRowAtIndexPath: 被触发时,但是当我编写 touchesBegan:withEvent 来查找 tableView 的触摸和 Pinch 事件时,它没有被触发。 Tableview 在视图上方是没有触发的原因,如果是,如何找到 tableView 或其某个单元格何时被触摸或捏合。


我找到了一种在表格视图单元格中找到捏或触摸的方法,声明 UIPinchGestureRecognizer tableView 中的第一个对象:didSelectRowAtIndexPath: 即

UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinch:)];
[tblAccountsList addGestureRecognizer:pinch];
[pinch release];

然后在下面写选择器方法……

- (void)handlePinch:(UIGestureRecognizer *)recognizer {
    NSLog(@"Pinch");
}

当我设置断点时,它正在执行,但该方法被调用了 3 次。 如果有人找到解决方案,请分享...

提前谢谢...

【问题讨论】:

  • 对不起,我不知道该怎么做,帮帮我...

标签: uitableview uitouch pinch touchesbegan


【解决方案1】:

touchesBegan 是 UIView 和 UITableViewCell 方法,而不是 UIViewController 和 UITableViewController 方法。因此您可以为 UITableViewCell 创建自定义类,它可以识别触摸事件并为我工作的触摸委托。

  //TableViewCell.h

#import <UIKit/UIKit.h>

@class Util;

@interface TableViewCell : UITableViewCell {

}
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier;

@end
   //TableViewCell.m
#import "TableViewCell.h"
@implementation TableViewCell

-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier      format:(NSString*)ec_format{

    if (self) {
        self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

   }

   return self;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 {
//you receive touch here 
    NSLog(@"Category Touch %@",self.frame);


}

在表格视图中你可以添加

- (void)viewDidLoad {

[super viewDidLoad];

// Add a pinch gesture recognizer to the table view.
UIPinchGestureRecognizer* pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinch:)];
[self.tableView addGestureRecognizer:pinchRecognizer];

// Set up default values.
self.tableView.sectionHeaderHeight = HEADER_HEIGHT;
/*
 The section info array is thrown away in viewWillUnload, so it's OK to set the default values here. If you keep the section information etc. then set the default values in the designated initializer.
 */
rowHeight_ = DEFAULT_ROW_HEIGHT;
openSectionIndex_ = NSNotFound;
}


#pragma mark Handling pinches


-(void)handlePinch:(UIPinchGestureRecognizer*)pinchRecognizer {

/*
 There are different actions to take for the different states of the gesture recognizer.
 * In the Began state, use the pinch location to find the index path of the row with which the pinch is associated, and keep a reference to that in pinchedIndexPath. Then get the current height of that row, and store as the initial pinch height. Finally, update the scale for the pinched row.
 * In the Changed state, update the scale for the pinched row (identified by pinchedIndexPath).
 * In the Ended or Canceled state, set the pinchedIndexPath property to nil.
 */

if (pinchRecognizer.state == UIGestureRecognizerStateBegan) {

    CGPoint pinchLocation = [pinchRecognizer locationInView:self.tableView];
    NSIndexPath *newPinchedIndexPath = [self.tableView indexPathForRowAtPoint:pinchLocation];
    self.pinchedIndexPath = newPinchedIndexPath;

    SectionInfo *sectionInfo = [self.sectionInfoArray objectAtIndex:newPinchedIndexPath.section];
    self.initialPinchHeight = [[sectionInfo objectInRowHeightsAtIndex:newPinchedIndexPath.row] floatValue];
    // Alternatively, set initialPinchHeight = uniformRowHeight.

    [self updateForPinchScale:pinchRecognizer.scale atIndexPath:newPinchedIndexPath];
}
else {
    if (pinchRecognizer.state == UIGestureRecognizerStateChanged) {
        [self updateForPinchScale:pinchRecognizer.scale atIndexPath:self.pinchedIndexPath];
    }
    else if ((pinchRecognizer.state == UIGestureRecognizerStateCancelled) || (pinchRecognizer.state == UIGestureRecognizerStateEnded)) {
        self.pinchedIndexPath = nil;
    }
}
}


-(void)updateForPinchScale:(CGFloat)scale atIndexPath:(NSIndexPath*)indexPath {

if (indexPath && (indexPath.section != NSNotFound) && (indexPath.row != NSNotFound)) {

    CGFloat newHeight = round(MAX(self.initialPinchHeight * scale, DEFAULT_ROW_HEIGHT));

    SectionInfo *sectionInfo = [self.sectionInfoArray objectAtIndex:indexPath.section];
    [sectionInfo replaceObjectInRowHeightsAtIndex:indexPath.row withObject:[NSNumber numberWithFloat:newHeight]];
    // Alternatively, set uniformRowHeight = newHeight.

    /*
     Switch off animations during the row height resize, otherwise there is a lag before the user's action is seen.
     */
    BOOL animationsEnabled = [UIView areAnimationsEnabled];
    [UIView setAnimationsEnabled:NO];
    [self.tableView beginUpdates];
    [self.tableView endUpdates];
    [UIView setAnimationsEnabled:animationsEnabled];
}
}

【讨论】:

【解决方案2】:

它被调用了 3 次,因为每次手势识别器的状态发生变化时都会调用它,而不是每次识别手势时都会调用它:)

试试这个改变:

- (void)handlePinch:(UIGestureRecognizer *)recognizer {
    if (recognizer.state == UIGestureRecognizerStateRecognized) {
        NSLog(@"Pinch");
    }
}

查看gesture recognisers here 的文档,特别是state 属性。

【讨论】:

    猜你喜欢
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多