3

tableViewの塗りつぶしが完了しました。セルをタップするとtableView:didSelectRowAtIndexPath:が起動されますが、touchesBegan:withEventを書き込んでtableViewのタッチイベントとピンチイベントを検索すると、起動されませんでした。Tableviewがビューの上にあるのは、起動しない理由があります。そうであれば、tableViewまたはその特定のセルがタッチまたはピンチされたときの検索方法です。


テーブルビューセルでピンチまたはタッチを見つける方法を見つけました。最初にtableView:didSelectRowAtIndexPathでUIPinchGestureRecognizerオブジェクトを宣言します。

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

次に、セレクターメソッドを以下に記述します...

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

ブレークポイントを設定すると実行されますが、メソッドが3回呼び出されていました。誰かが解決策を見つけたらそれを共有してください...

前もって感謝します...

4

2 に答える 2

10

touchesBeganは、UIViewControllerおよびUITableViewControllerメソッドではなく、UIViewおよびUITableViewCellメソッドです。そのため、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];
}
}
于 2012-01-09T10:58:28.797 に答える
1

ジェスチャが認識されるたびではなく、ジェスチャ認識機能の状態が変化するたびに呼び出されるため、3回呼び出されています:)

この変更を試してください:

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

そして、ここでジェスチャー認識機能のドキュメント、特にstateプロパティを確認してください。

于 2012-09-19T12:38:16.167 に答える