2011-02-07 72 views
0

我有一個非常簡單的代碼用於拖放和繪圖。在視圖中拖動視圖,將其限制在內

三個視圖:根視圖基本上是窗口(帶有幾個界面控件)。其中,我有一個「畫布」視圖。在畫布視圖中,我有第三個視圖(一個角色的小圖形),用戶可以在畫布內「拖動」。拖動工作正常。

問題是,我似乎無法約束我的「人物」在畫布的範圍內。理想情況下,當他跑到畫布邊緣時,他應該停下來(不會溢出到根視圖中)

畫布視圖剪輯子視圖;所以他一旦超越邊緣就會消失 - 但我不希望他消失,我希望他不能再進一步。

我也在我的動畫之前調用了CGRectIsWithinRect,這在原則上應該做到這一點。問題在於動畫發生時角色的框架沒有更新 - 只要他已經在移動,他就會繼續向右側移動頁面。

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


UIView * charView = [[canvasView floatingView] retain]; 

CGPoint pt = [[touches anyObject] locationInView:canvasView]; 

if (CGRectContainsPoint([canvasView bounds], pt)) { 

    CGRect charFrame = charView.frame; 
    CGRect containerFrame = canvasView.frame; 
    BOOL inTheYard= CGRectContainsRect(containerFrame, charFrame); 

    if (inTheYard == NO) { 
     //if we're at the edge, don't go any further 
     return; 
    } 


    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
    [UIView setAnimationDuration:.2]; 

    CGFloat x = floatingView.center.x + (pt.x - startPoint.x); 
    CGFloat y = floatingView.center.y + (pt.y - startPoint.y); 

    CGPoint middle = CGPointMake(x,y); 

    floatingView.center = middle; 

    [UIView commitAnimations]; 
    [floatingView release]; 
} 
} 

我該如何阻止他移動超過他的監視邊緣?

回答

1

而不是檢查觸摸事件是否在畫布內,你可以將它夾在裏面。分別檢查觸摸事件的x和y點,如果它們在畫布外部,則將角色移動到畫布的該側的牆上。

CGFloat w = canvasFrame.frame.size.width; 
CGFloat h = canvasFrame.frame.size.height; 

if (pt.x < 0) pt.x = 0; 
if (pt.x > w) pt.x = w; 
if (pt.y < 0) pt.y = 0; 
if (pt.y > h) pt.y = h; 

這將讓你保持拖着畫布牆上的人物,即使觸摸事件是外部(如果去掉inTheYard檢查)。