首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS 判斷子視圖重疊:使用 CGRectIntersectsRect 偵測拖曳碰撞

     編輯:程式設計綜合問答

應用場景

在 iOS 應用中,使用者透過 UIPanGestureRecognizer 拖曳一個子視圖,需即時檢測該視圖是否與另一個固定子視圖重疊(碰撞)。

核心解法

使用 Core Graphics 提供的 CGRectIntersectsRect 函數,傳入兩個視圖的 frame 即可判斷矩形區域是否相交。

if (CGRectIntersectsRect(draggedView.frame, targetView.frame)) {
    // 發生重疊,執行對應邏輯(如顯示提示、吸附、觸發動畫等)
    NSLog(@"視圖重疊了!");
}

完整範例:拖曳手勢中即時檢測

- (void)handlePan:(UIPanGestureRecognizer *)pan {
    UIView *draggedView = pan.view;
    CGPoint translation = [pan translationInView:self.view];
    draggedView.center = CGPointMake(draggedView.center.x + translation.x,
                                     draggedView.center.y + translation.y);
    [pan setTranslation:CGPointZero inView:self.view];

    if (pan.state == UIGestureRecognizerStateChanged) {
        if (CGRectIntersectsRect(draggedView.frame, targetView.frame)) {
            // 重疊時的視覺回饋
            targetView.backgroundColor = [UIColor redColor];
        } else {
            targetView.backgroundColor = [UIColor clearColor];
        }
    } else if (pan.state == UIGestureRecognizerStateEnded) {
        // 結束時可判斷是否吸附、回彈等
        targetView.backgroundColor = [UIColor clearColor];
    }
}

注意事項

  • frame 以父視圖座標系為準,確保兩視圖同層或轉換座標系(convertRect:toView:)。
  • 若視圖有旋轉、縮放,frame 可能不準確,改用 bounds 配合 CGAffineTransform 計算。
  • 效能考量:CGRectIntersectsRect 極輕量,可在每幀呼叫無負擔。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved