1

2つのカスタムuibuttonがあります。

@interface myButton : UIButton

私は次のようないくつかの方法を上書きします

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
  // do something
}

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

    if (!CGRectContainsPoint(self.bounds, touchPoint)) {
        [self touchesCancelled:touches withEvent:event];
    }
    return;
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
   // do something
}

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesCancelled:touches withEvent:event];
    return;
}

欲しいのは、ボタンをタッチすると、別のボタンにタッチを動かし続けることができるということです。タッチが最初にタッチしたボタンの範囲外になると、touchesCancelledを呼び出すのに疲れました。だから私は「考えて」、それから別のボタンに移動します。それは新しいタッチイベントになります。しかし、それはこのようには機能しません。

私は何か間違ったことをしましたか?または、touchesCancelledメソッドはこのように使用されませんか?前もって感謝します!

4

1 に答える 1

2

あなたの疑惑は正しいです、これは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...
    }
}
于 2013-03-31T12:41:59.577 に答える