2011-02-07 2 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).

 Смежные вопросы

  • Нет связанных вопросов^_^