2012-01-08 2 views
8

У меня есть небольшая проблема с распознавателями жестов.Панорамный жест беспорядочно направлен на направление вращения

У меня есть класс под названием «Sprite», который является просто UIImageView. Sprite имеет свои собственные распознаватели жестов и методы обработки, чтобы пользователь мог панорамировать, поворачивать и изменять размер графики.

Вот мой код:

-(void)setup{ //sets up the imageview... 
//add the image, frame, etc. 
    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; 
    UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinch:)]; 
    UIRotationGestureRecognizer *rotateGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(handleRotate:)]; 

    [self addGestureRecognizer:panGesture]; 
    [self addGestureRecognizer:pinchGesture]; 
    [self addGestureRecognizer:rotateGesture]; 
} 

//handling methods 
-(void)handlePinch:(UIPinchGestureRecognizer *)recognizer{ 
    recognizer.view.transform = CGAffineTransformScale(recognizer.view.transform, recognizer.scale, recognizer.scale); 
    recognizer.scale = 1; 
} 

-(void)handleRotate:(UIRotationGestureRecognizer *)recognizer{ 
    recognizer.view.transform = CGAffineTransformRotate(recognizer.view.transform, recognizer.rotation); 
    recognizer.rotation = 0; 
} 
-(void)handlePan:(UIPanGestureRecognizer *)recognizer{ 
    CGPoint translation = [recognizer translationInView:self]; 
    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, recognizer.view.center.y + translation.y); 
    [recognizer setTranslation:CGPointMake(0, 0) inView:self] 
} 

Так в основном каждый из них прекрасно работает самостоятельно. Однако, когда я поворачиваю или изменяю размер изображения, панорамирование становится проблематичным. Например, если вы поворачиваете изображение вверх дном, то жесты панорамирования будут перемещать изображение в обратном направлении (вверх вниз, перетаскивание влево перемещает его вправо и т. Д.). Аналогично, измененный спрайт не будет качаться с той же скоростью/расстоянием, что и раньше.

Любые идеи о том, как я могу это исправить? Я бы предпочел сохранить этот код внутри класса Sprite, а не ViewController (если возможно). Спасибо.

ответ

12

Вместо переводаInView: self, попробуйте translationInView: self.superview.

+0

Txs @Jerry, отличный ответ. Это сводило меня с ума! –

+0

@Jerry, это хорошо работает ... –

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