0

これはレスポンダー チェーンの基本的な誤解だと思います。iOS4 から変更されましたか? いくつかのサブビューを持つビューがあります。スーパービューには、サブビューを配置する以外の目的はなく、タッチの処理とは何の関係もありません。サブビューでタッチをリッスンしたいのですが、スーパービューがタッチ イベントをブロックしているようです。スーパービューがサブビューにタッチを渡したと思いましたか? これに関するいくつかの記事を読みましたが、頭がわかりません。いくつかの投稿では、スーパービューの userInteractionEnabled を NO に設定するとうまくいくことが示唆されているようですが、これを行ってもまだタッチが通らないようです。

意味がはっきりしない場合のために、簡略化したコードをいくつか示します。赤いビュー内をタップしても、NSLog はトリガーされません...

@implementation ViewController
@synthesize redView;

- (void)viewDidLoad
{  
    UIView *blueView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 200, 400)];
    blueView.backgroundColor = [UIColor blueColor];
    [self.view addSubview:blueView];
    redView = [[UIView alloc]initWithFrame:CGRectMake(20, 20, 40, 40)];
    redView.backgroundColor = [UIColor redColor];
    [blueView addSubview:redView];
    [super viewDidLoad];
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:self.view];

    if (CGRectContainsPoint(redView.frame, touchPoint)) {
        NSLog(@"red got touched");
    }
}

@end
4

2 に答える 2

0

ここでエラーが表示されますが、そのメソッドの開始ブラケットの直後に [super viewDidLoad] を呼び出すことが非常に重要です。2 番目に、ターゲット アクション パターンに基づいたジェスチャ レコグナイザーを使用することをお勧めします。3番目に、座標系をいじっています。

于 2012-06-30T18:21:41.157 に答える
0

受け取っているタッチの座標は、囲んでいるビューの座標系で表されます。そのため、blueView のオフセットでそれらを修正する必要があります。1 つの方法は、オブジェクトに blueView プロパティを追加してから touchesBegan メソッドで修正することです。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
   UITouch *touch = [touches anyObject];
   CGPoint touchPoint = [touch locationInView:self.view];

   touchPoint.x -= blueView.frame.origin.x;
   touchPoint.y -= blueView.frame.origin.y;
   if (CGRectContainsPoint(redViewFrame, touchPoint)) {
      NSLog(@"red got touched");
   }
}

または、blueView の UIView をサブクラス化し、そこで touchesBegan をオーバーライドすることもできます

于 2012-06-30T17:07:02.807 に答える