1

問題:

サブビューとしてUITableViewを持つUIViewがあります。UIView にはUITapGestureRecognizerが構成されています。

私の問題は、テーブルのタップが UIView のジェスチャ認識エンジンによって消費されることです。その結果、テーブル ビューにタップが表示されなくなります。

ポイントがテーブルのフレーム内にあるときに認識機能を失敗させるにはどうすればよいですか、またはテーブルをタップのデフォルトのコンシューマーにするにはどうすればよいですか。

(コード例が示すように) 多くのメソッドpointInside:withEventhitTest:withEventを試しましたが、その方法がよくわかりません。

問題を表すコードは次のとおりです。コントローラー:

#import <UIKit/UIKit.h>
#import "ABCDTableView.h"

@interface ABCDFirstView : UIView
@property (nonatomic,strong) ABCDTableView *tableView;
@end

#import "ABCDFirstView.h"

@implementation ABCDFirstView
@synthesize tableView;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self awakeFromNib];
    }
    return self;
}

- (void)awakeFromNib
{

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
                                   initWithTarget:self action:@selector(viewTouch:)];

    [self addGestureRecognizer:tap];
}

- (void)viewTouch:(UIGestureRecognizer *)gesture {
    NSLog(@"view touched");
}


- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    if (CGRectContainsPoint(self.tableView.bounds, point)) {
        NSLog(@"point in table point as well as view");
        return NO;
    }
    else if (CGRectContainsPoint(self.bounds, point)) {
        NSLog(@"point only in view");
        return YES;
    }
    NSLog(@"point not in view");
    return NO;
}


- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView *view    = [super hitTest:point withEvent:event];
    NSLog(@"view hittest res: %@",view);

    return view;
}
@end

テーブルビュー

#import <UIKit/UIKit.h>

@interface ABCDTableView : UITableView
    <UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, strong) NSArray *list;


@end



#import "ABCDTableView.h"

@implementation ABCDTableView
@synthesize list;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self awakeFromNib];
    }
    return self;
}

- (void)awakeFromNib
{
    self.delegate   = self;
    self.dataSource = self;

    // create table list
    self.list       = [[NSArray alloc]
                       initWithObjects: @"one",@"two",@"three",@"four",@"five",
                       @"six", @"seven", @"eight", @"nine", @"ten", nil];



}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.list count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellID = @"cell";
    UITableViewCell *cell   = [self dequeueReusableCellWithIdentifier:cellID];

    if (cell == nil) {
        cell    = [[UITableViewCell alloc]
                   initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
    }

    cell.textLabel.text = [self.list objectAtIndex:[indexPath row]];

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"row selected");
}


@end

意見

#import <UIKit/UIKit.h>
#import "ABCDTableView.h"

@interface ABCDFirstView : UIView
@property (nonatomic,strong) ABCDTableView *tableView;
@end

#import "ABCDFirstView.h"

@implementation ABCDFirstView
@synthesize tableView;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self awakeFromNib];
    }
    return self;
}

- (void)awakeFromNib
{

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
                                   initWithTarget:self action:@selector(viewTouch:)];

    [self addGestureRecognizer:tap];
}

- (void)viewTouch:(UIGestureRecognizer *)gesture {
    NSLog(@"view touched");
}


- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    if (CGRectContainsPoint(self.tableView.bounds, point)) {
        NSLog(@"point in table point as well as view");
        return NO;
    }
    else if (CGRectContainsPoint(self.bounds, point)) {
        NSLog(@"point only in view");
        return YES;
    }
    NSLog(@"point not in view");
    return NO;
}


- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView *view    = [super hitTest:point withEvent:event];
    NSLog(@"view hittest res: %@",view);

    return view;
}
@end
4

1 に答える 1

3

UIGestureRecognizerDelegate メソッドを使用する

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;

touch.view が、ジェスチャ レコグナイザーを受け取るビューと同じビューであるかどうかを確認します。

于 2012-11-27T11:35:16.947 に答える