2

ウィンドウに2つのUIViewがあります。1つはプレーヤーのスコアを保持するためのもの(サイドバー)、もう1つはメインのプレイエリアです。どちらもUIWindowに収まり、どちらもスクロールしません。ユーザーはメインのプレイエリアでUIButtonをドラッグできますが、現在はサイドバーにドロップできます。一度実行すると、元に戻すために再度ドラッグすることはできません。おそらく、問題のボタンが含まれていない2番目のビューをタップしているためです。

メインビュー内の何かがサイドバービューに移動しないようにしたいと思います。私はこれを管理しましたが、プレーヤーの指がそのビューから離れた場合にドラッグを解放する必要があります。以下のコードでは、ボタンは指で動き続けますが、ビューのX座標を超えません。どうすればこれに取り組むことができますか?ドラッグは、次の呼び出しを使用して有効になります。

[firstButton addTarget: self action: @selector(wasDragged: withEvent:) forControlEvents: UIControlEventTouchDragInside];

この方法に:

- (void) wasDragged: (UIButton *) button withEvent: (UIEvent *) event
{
    if (button == firstButton) {
        UITouch *touch = [[event touchesForView:button] anyObject];
        CGPoint previousLocation = [touch previousLocationInView:button];
        CGPoint location = [touch locationInView:button];
        CGFloat delta_x = location.x - previousLocation.x;
        CGFloat delta_y = location.y - previousLocation.y;
        if ((button.center.x + delta_x) < 352)
        {
            button.center = CGPointMake(button.center.x + delta_x, button.center.y + delta_y);
        } else {
            button.center = CGPointMake(345, button.center.y + delta_y);
        }
    }
}
4

1 に答える 1

0

埋め込む

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

デリゲートメソッドをタッチしてから、の場所を確認します。UITouch場所が許可する範囲外にある場合(最初のビュー)、それ以上移動しないでください。BOOLまた、ユーザーがiVarを使用してビューの外にドラッグした時点で、タッチを強制終了することもできます。

//In .h file
BOOL touchedOutside;

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    touchedOutside = NO;
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    if (!touchedOutside) {  
        UITouch *touch = [[event allTouches] anyObject];
        CGPoint location = [touch locationInView:firstView];

          if (location.x < UPPER_XLIMIT && location.x > LOWER_XLIMIT) {
              if (location.y < UPPER_YLIMIT && location.x > LOWER_YLIMIT) {

                  //Moved within acceptable bounds
                  button.centre = location;
              }
          } else {
              //This will end the touch sequence
              touchedOutside = YES;

              //This is optional really, but you can implement 
              //touchesCancelled: to handle the end of the touch 
              //sequence, and execute the code immediately rather than
              //waiting for the user to remove the finger from the screen
              [self touchesCancelled:touches withEvent:event];   
    }
}
于 2012-11-22T17:26:47.860 に答える