1

親 UIView と子 UIView があります。タッチを子から親に渡し、2 つのビューで処理します。

y--------------
| parent      |
|   x------   |
|   |child|   |
|   |_____|   |
|_____________|

したがって、子ビューでは、次をオーバーライドします。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    // child touch handle 
    // ...
    // parent touch handle
    [self.nextResponder touchesBegan:touches withEvent:event];
}
しかし、子の「x」に触れると、親の「y」に転送されます(親に対して)。パススルー効果(子で「x」、親で「x」にパススルー)が欲しいので、転送する前にタッチの位置を変更する必要がありますよね?どうすればいいですか?

ありがとう@Fogmeister。以上です。

UITouch は親に渡すことができるようになりました。そして、親のtouchesBeganで、呼び出します

[touch locationInView:self]

タッチ位置を取得します。

4

1 に答える 1

4

TL:DR

変換は行わず、locationInView: メソッドのみを使用してください。

ロングバージョン

このためには、コード locationInView: を次のように使用できます...

UITouch *touch = [touches anyObject]; //assuming there is just one touch.

CGPoint touchPoint = [touch locationInView:someView];

これにより、タッチの画面座標が渡されたビューの座標に変換されます。

つまり、ユーザーが子ビューでポイント (10, 10) をタップし、それを次のレスポンダー、つまり親に渡します。[touch locationInView:parentView] を実行すると、(60, 60) のようなポイントが得られます (ダイアグラムから大まかに推測します)。

locationInView の UITouch ドキュメント

locationInView: 指定されたビューの座標系における受信機の現在の位置を返します。

-(CGPoint)locationInView:(UIView *)ビュー

パラメーター

見る

タッチを配置する座標系のビュー オブジェクト。タッチを処理するカスタム ビューでは、self を指定して、独自の座標系でタッチ位置を取得できます。ウィンドウの座標でタッチ位置を取得するには、nil を渡します。

戻り値

ビュー内のレシーバーの位置を指定するポイント。

討論

このメソッドは、指定されたビューの座標系における UITouch オブジェクトの現在の位置を返します。タッチ オブジェクトが別のビューからビューに転送された可能性があるため、このメソッドは、指定されたビューの座標系へのタッチ位置の必要な変換を実行します。

parentView フレーム (0, 0, 320, 480) と呼ばれるビュー、つまり画面全体があります。これには、childView フレーム (50、50、100、100) と呼ばれるサブビューがあります。

チャイルドビューで

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];

    CGPoint touchLocation = [touch locationInView:self];

    NSLog(@"Child touch point = (%f, %f).", touchLocation.x, touchLocation.y);

    [self.nextResponder touchesBegan:touches withEvent:event];
}

親ビューで

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];

    CGPoint touchLocation = [touch locationInView:self];

    NSLog(@"Parent touch point = (%f, %f).", touchLocation.x, touchLocation.y);
}

*今...

ユーザーは、子ビューのちょうど中央で画面を押します。

プログラムの出力は...

Child touch point = (50, 50). //i.e. this is the center of the child view relative to the **child view**.
Parent touch point = (150, 150). //i.e. this is the center of the child view relative to the **parent view**.

私はまったく変換を行っていません。メソッド locationInView がこれをすべて行います。あなたはそれを過度に複雑にしようとしていると思います。

于 2013-01-03T15:58:37.567 に答える