2012-07-01 68 views
3

所以我有一個叫做fallingBall的UIView,它與我的UIView很好地碰撞,叫做theBlockView。我正在使用CGRectIntersectsRect(theBlockView.frame, fallingBall.frame)來檢測這種碰撞。Cocoa iOS將矩形變成帶有碰撞的圓

這一切都很好,所以現在我想我的fallingBall實際上是圓的,我還想要圓角theBlockView的頂角。要做到這一點,我用下面的代碼:

//round top right-hand corner of theBlockView 
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:theBlockView.bounds 
              byRoundingCorners:UIRectCornerTopRight 
              cornerRadii:CGSizeMake(10.0, 10.0)]; 
CAShapeLayer *maskLayer = [CAShapeLayer layer]; 
maskLayer.frame = theBlockView.bounds; 
maskLayer.path = maskPath.CGPath; 
theBlockView.layer.mask = maskLayer; 

//round the fallingBall view 
[[fallingBall layer] setCornerRadius:30]; 

但是,有趣的是,雖然它們看起來不錯,圓潤,意見仍然是矩形。 所以我的問題是:我怎樣才能讓CGRectIntersectsRect把它們看成是他們看起來像的形狀?是否有一個功能相同,但使用視圖的alpha來檢測碰撞?

謝謝你的時間!

回答

3

其實,讓我回答我自己的問題!

好的,所以我花了大部分的時間在最近的10個小時中尋找,我碰到過這個帖子:Circle-Rectangle collision detection (intersection) - 查看e.James要說什麼!

我寫了一個函數來幫助這樣的:首先,聲明如下struct S:

typedef struct 
{ 
    CGFloat x; //center.x 
    CGFloat y; //center.y 
    CGFloat r; //radius 
} Circle; 
typedef struct 
{ 
    CGFloat x; //center.x 
    CGFloat y; //center.y 
    CGFloat width; 
    CGFloat height; 
} MCRect; 

然後添加以下功能:

-(BOOL)circle:(Circle)circle intersectsRect:(MCRect)rect 
{ 

    CGPoint circleDistance = CGPointMake(abs(circle.x - rect.x), abs(circle.y - rect.y)); 

    if (circleDistance.x > (rect.width/2 + circle.r)) { return false; } 
    if (circleDistance.y > (rect.height/2 + circle.r)) { return false; } 

    if (circleDistance.x <= (rect.width/2)) { return true; } 
    if (circleDistance.y <= (rect.height/2)) { return true; } 

    CGFloat cornerDistance_sq = pow((circleDistance.x - rect.width/2), 2) + pow((circleDistance.y - rect.height/2), 2); 

    return (cornerDistance_sq <= (pow(circle.r, 2))); 
} 

我希望這可以幫助別人!

2

CGRectIntersectsRect將始終使用矩形,視圖的框架也將始終爲矩形。你將不得不編寫你自己的功能。您可以使用視圖的中心來計算使用圓角半徑的圓,並測試矩形和圓形以某種方式相交。

+0

好的,謝謝你的提示! –