2017-11-01 6 views
0

私は画面境界でrectの動きを制限しようとしています。ロジックは簡単ですが、の中にをタップして(どこにいなくても)タップしてドラッグします。それはあなたの指に続き、それはrectの境界線が画面の境界に達したときに停止する必要があります。は画面の境界を移動しますが、どのようにして画面の境界線からrectの動きを制限することができますか

- (void)viewDidLoad { 
[super viewDidLoad]; 
rect.backgroundColor = [UIColor redColor]; 

}

、私はタップがどこにあるかを把握しようとすると、その矩形の内側に私は私の後

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { 
//NSLog(@"%s", __PRETTY_FUNCTION__); 
UITouch *touch = touches.anyObject; 
if (touch.view == rect) { 
    rect.backgroundColor = [UIColor greenColor]; 
    isSelectedRect = YES; 

    CGPoint point = [touch locationInView:self.view]; 
    CGPoint center = rect.center; 

    delta = CGPointMake(point.x - center.x, 
         point.y - center.y); 

} else { 
    rect.backgroundColor = [UIColor redColor]; 
    isSelectedRect = NO; 
} 

}

矩形の色を変更した場合この矩形を移動する

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event 
{ 
    //NSLog(@"%s", __PRETTY_FUNCTION__); 
    if (isSelectedRect) { 
     UITouch *touch = touches.anyObject; 
     CGPoint point = [touch locationInView:self.view]; 
     rect.center = CGPointMake(point.x - delta.x, 
            point.y - delta.y); 
    } 
} 

最終的には、コードの1行を書く必要があります。コードの行は、スクイリエンスの範囲で移動を制限します。私は三元演算子でそれを作るのが完璧だろう。助けていただければ幸いです。

答えて

0

touchesMovedメソッドを以下のコードに置き換えてください。あなたに役立つことを望みます;)

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { 
    //NSLog(@"%s", __PRETTY_FUNCTION__); 
    if (isSelectedRect) { 
    UITouch *touch = touches.anyObject; 
    CGPoint point = [touch locationInView:self.view]; 
    CGPoint newCenter = CGPointMake(point.x - delta.x, 
          point.y - delta.y); 
    CGFloat rectHeight = rect.frame.size.height; 
    CGFloat rectWidth = rect.frame.size.width; 

    CGFloat screenWidth = self.view.frame.size.width; 
    CGFloat screenHeight = self.view.frame.size.height; 


    if (newCenter.x + rectWidth/2 > screenWidth) { 
     newCenter.x = screenWidth - rectWidth/2; 
    } 

    if (newCenter.x - rectWidth/2 < 0) { 
     newCenter.x = rectWidth/2; 
    } 

    if (newCenter.y + rectHeight/2 > screenHeight) { 
     newCenter.y = screenHeight - rectHeight/2; 
    } 

    if (newCenter.y - rectHeight/2 >= 0) { 
     newCenter.y = rectHeight/2; 
    } 

    rect.center = newCenter; 
    } 
} 
+0

ありがとうございます。それは適切に動作します。ただ1つの質問ですが、速い速度でドラッグすると、rectの境界線が画面境界に触れません。それらの間には小さな領域があります。あなたがそれをゆっくりとすると、すべてが大丈夫です、rectとscreen境界の間にはスペースがありません。なぜそれが起こるのですか? – PaSol

+0

@PaSol私は自分の答えを更新しました。あなたはもう一度それを試すことができます;) – trungduc

+0

ありがとうございます:)すべてが完璧です。 – PaSol

0
if (CGRectContainsPoint(boundsRect, point)) { 
    rect.center = CGPointMake(point.x - delta.x, 
            point.y - delta.y); 
} 

ここで、boundsRectはデバイスの長方形になります。

0

touchesMoved関数で移動するポイントは、ビューの中心点であることに注意する必要があります。 viewBoundsの外に出ることを制限するには、ドラッグ可能なビューの境界が翻訳ポイントを超えているかどうかをチェックする必要があります。実際の境界

CGPoint center = rect.center; 
CGSize size = rect.size 
CGRect originalRect = CGRectMake(center.x - size.width/2, center.y - size.height/2, size.width, size.height); 

を取得する

は今、与えられた矩形が必要な矩形内にあるかどうかを確認してください。

if (CGRectContainsRect(boundsRect, originalRect)) { 
    // Here change the center of the view 
} 

私はこれが役に立ちます。

関連する問題