Перетаскивание вида внутри вида, ограничение его внутри - PullRequest
0 голосов
/ 07 февраля 2011

У меня есть довольно простой код для перетаскивания и рисования.

Три вида: Корневой вид - это в основном окно (с несколькими элементами управления интерфейсом). В этом у меня есть представление "холста". В рамках холста у меня есть третий вид (небольшой рисунок персонажа), который пользователь должен «перетаскивать» внутри холста. Перетаскивание работает отлично.

Проблема в том, что я не могу ограничить свой «характер» в рамках холста. В идеале, когда он сталкивается с краем холста, он должен остановиться (не перетекать в корневой вид)

Холст, просмотр клипов, подпредставлений; поэтому он исчезает, как только переходит границу, но я не хочу, чтобы он исчез, я хочу, чтобы он не мог идти дальше.

Я также вызываю 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 Ответ

1 голос
/ 15 февраля 2011

Вместо того, чтобы проверять, находится ли событие касания внутри холста, вы можете зажать его, чтобы оно было внутри.Проверьте точки 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).

...