Ошибка при перемещении UIView по горизонтали - PullRequest
0 голосов
/ 07 марта 2011

Я создал пазл для iPad (iOS SDK 4.2)

У меня есть PuzzleViewController, который управляет UIView (rootView), который содержит меньший UIView (puzzleView) и двенадцать частей головоломки (класс PuzzlePieceView расширяет UIImageView).

Идея очень проста. Кусочки головоломки находятся вокруг PuzzleView и выбираются и перетаскиваются в PuzzleView. Когда части собраны, они удваиваются, они имеют размер и центрированы так, чтобы касаться пальца. Когда они попадают в нужное место, они остаются на месте (они удаляются из rootView и добавляются в качестве подпредставлений в PuzzleView), если они попадают в неправильное место, они возвращаются к исходному положению и размеру.

В настоящее время я переопределяю прикосновения Begin / Moved / Ended / Cancelled в классе PuzzlePieceView, чтобы каждый PuzzlePiece управлял своими собственными движениями.

вот что они делают

#pragma mark UIResponder overriding

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"PuzzlePiece touchesBegan");
    if (!isDeployed) {
        if (self.initialSize.width == 0 || self.initialSize.height ==0) { //if there is still no initial size
            self.initialSize = self.frame.size;
        }
        NSLog(@"self.initialLocation.x %f %f", self.initialLocation.x, self.initialLocation.y);
        if (self.initialLocation.x == 0. || self.initialLocation.y == 0.) { //if there is still no initial location
            self.initialLocation = self.center; //record the initial location
        }
        UITouch *touch = [[event allTouches] anyObject];
        self.center = [touch locationInView:self.superview]; //set the center of the view as the point where the finger touched it
        [self.superview bringSubviewToFront:self]; //the piece brings itself as frontMostView so that it is always visible and never behind any other piece while moving
    }
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"PuzzlePiece touchesMoved");
    if (self.frame.size.width == self.initialSize.width) {
        self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.image.size.width, self.image.size.height);
    }
    if (!isDeployed) {
        UITouch *touch = [[event allTouches] anyObject];
        self.center = [touch locationInView:self.superview]; //set the center of the view as the point where the finger moved to
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"PuzzlePiece touchesEnded");
    if (!isDeployed) {
        UITouch *touch = [[event allTouches] anyObject];
        NSLog(@"point %@ x%f y%f", self.puzzleView, [touch locationInView:self.puzzleView].x, [touch locationInView:self.puzzleView].y);
        if (CGRectContainsPoint(self.dropZone,[touch locationInView:self.puzzleView])) {
            [self removeFromSuperview];
            [self.puzzleViewController addPiece:self];
            self.center = self.finalCenter;
            self.isDeployed = YES;
        }
        else {
            [self restoreToInitialSize];
            [self restoreToInitialPosition];
        }
    }

}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"PuzzlePiece touchesCancelled");
    if (!isDeployed) {
        [self restoreToInitialSize];
        [self restoreToInitialPosition];
    } 
}

#pragma mark -

Казалось, довольно легко, и это было.

У меня осталась только одна ошибка. Когда я пытаюсь сделать горизонтальное движение на любой части головоломки, прикосновение получает отменено . Это происходит только тогда, когда движение начинается быстро. Если я коснусь части и подожду минуту (около секунды), части будут двигаться идеально. Части также идеально двигаются в вертикальном направлении.

Я пытался не изменять размер головоломки при первом касании вида, но ошибка остается ...

1 Ответ

0 голосов
/ 09 марта 2011

Я нашел решение для этого.Один из моих товарищей по команде зарегистрировал UISwipeGestureRecognizer в RootView вместо конкретного подпредставления, в котором должен быть распознан swipeGesture.

...