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 がこれをすべて行います。あなたはそれを過度に複雑にしようとしていると思います。