あなたの疑惑は正しいです、これはtouchesCancelled:withEvent:
意図された方法ではありません。ドキュメントから:
このメソッドは、CocoaTouchフレームワークがタッチイベントのキャンセルを必要とするシステム割り込みを受信したときに呼び出されます。このために、UITouchPhaseCancelのフェーズを持つUITouchオブジェクトを生成します。中断は、アプリケーションがアクティブでなくなったり、ビューがウィンドウから削除されたりする原因となる可能性があります。
ユーザーが電話の着信、SMS、またはアラームが鳴った場合などに、レスポンダーはタッチキャンセルイベントを受け取ります。これは、他のタッチイベントで確立された状態情報をクリーンアップするために使用する必要があります。
タッチイベントに関連付けられているレスポンダーをタッチの途中で変更したいようです。つまり、最初のボタンの境界からタッチをドラッグして2番目のボタンの境界に入ると、タッチイベントを受信するレスポンダーになります。残念ながら、それはレスポンダーが機能するように設計されている方法ではありません。でUIView
返されるように、がレスポンダーとして識別されるとhitTest:withEvent:
、これはUIView
タッチイベントを受信するためのものになります。
必要なことを達成するための可能なトレーニングは、両方のボタンを含むスーパービューでタッチイベント(など)touchesBegan:withEvent:
を処理することです。touchesMoved:withEvent:
次に、スーパービューはタッチイベントを受け取り、どのボタンのフレーム内にあるかに応じてアクションを実行できます。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
for (UITouch *touch in touches)
{
CGPoint touchLocation = [touch locationInView:self.view];
UIButton *button;
if (CGRectContainsPoint(self.button1.frame, touchLocation))
{
button = self.button1;
NSLog(@"touchesMoved: First Button");
}
else if (CGRectContainsPoint(self.button2.frame, touchLocation))
{
button = self.button2;
NSLog(@"touchesMoved: Second Button");
}
// Do something with button...
}
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
for (UITouch *touch in touches)
{
CGPoint touchLocation = [touch locationInView:self.view];
UIButton *button;
if (CGRectContainsPoint(self.button1.frame, touchLocation))
{
button = self.button1;
NSLog(@"touchesMoved: First Button");
}
else if (CGRectContainsPoint(self.button2.frame, touchLocation))
{
button = self.button2;
NSLog(@"touchesMoved: Second Button");
}
// Do something with button...
}
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
for (UITouch *touch in touches)
{
CGPoint touchLocation = [touch locationInView:self.view];
UIButton *button;
if (CGRectContainsPoint(self.button1.frame, touchLocation))
{
button = self.button1;
NSLog(@"touchesEnded: First Button");
}
else if (CGRectContainsPoint(self.button2.frame, touchLocation))
{
button = self.button2;
NSLog(@"touchesEnded: Second Button");
}
// Do something with button...
}
}