在 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 極輕量,可在每幀呼叫無負擔。