0

Когда я применяю panDetected вот так, изображение перемещается повсюду на экране. Я просто хочу, чтобы эта функция была сверху в определенном прямоугольнике. Что я должен изменить?Как дать конкретный распознаватель жестов

-(void) panDetected: (UIPanGestureRecognizer *) panRecognizer { 
    CGPoint translation = [panRecognizer translationInView: self.documentImageView]; 
    CGPoint imageViewPosition = self.documentImageView.center; 
    imageViewPosition.x += translation.x; 
    imageViewPosition.y += translation.y; 

    self.documentImageView.center = imageViewPosition; 
    [panRecognizer setTranslation: CGPointZero inView: self.view]; 
} 

И этот только позволяет мне увеличить изображение, но только из средней точки не каждую точку на рис.

-(void) handlePinchWithGestureRecognizer: (UIPinchGestureRecognizer *) pinchGestureRecognizer { 

    CGFloat lastScale = 1.0; 
    if ([pinchGestureRecognizer state] == UIGestureRecognizerStateBegan) { 
     // Reset the last scale, necessary if there are multiple objects with different scales 
     lastScale = [pinchGestureRecognizer scale]; 
    } 

    if ([pinchGestureRecognizer state] == UIGestureRecognizerStateBegan || [pinchGestureRecognizer state] == UIGestureRecognizerStateChanged) { 

     CGFloat currentScale = [ 
      [ 
       [pinchGestureRecognizer view].layer valueForKeyPath: @ 
       "transform.scale"] floatValue]; 

     // Constants to adjust the max/min values of zoom 
     const CGFloat kMaxScale = 1.15; 
     const CGFloat kMinScale = 1.0; 

     CGFloat newScale = 1 - (lastScale - [pinchGestureRecognizer scale]); 
     newScale = MIN(newScale, kMaxScale/currentScale); 
     newScale = MAX(newScale, kMinScale/currentScale); 
     self.documentImageView.transform = CGAffineTransformScale(self.documentImageView.transform, newScale, newScale); 

     lastScale = [pinchGestureRecognizer scale]; // Store the previous scale factor for the next pinch gesture call 
    } 
} 

-(void) setExtractedImageForTableView: (UIImage *) extractedImage { 
    self.documentImageView.image = nil; 
    self.documentImageView = nil; 
    self.documentImageView = [ 
     [UIImageView alloc] initWithImage: extractedImage]; 

    self.documentImageView.userInteractionEnabled = YES; 
    UIPinchGestureRecognizer * pinchGestureRecognizer = [ 
     [UIPinchGestureRecognizer alloc] initWithTarget: self action: @selector(handlePinchWithGestureRecognizer:)]; 
    [self.documentImageView addGestureRecognizer: pinchGestureRecognizer]; 

    UIPanGestureRecognizer * panRecognizer = [ 
     [UIPanGestureRecognizer alloc] initWithTarget: self action: @selector(panDetected:)]; 
    [self.documentImageView addGestureRecognizer: panRecognizer]; 

    self.documentImageView.contentMode = UIViewContentModeScaleAspectFit; 
    if (!CGSizeEqualToSize(extractedImage.size, CGSizeZero)) { 
     self.documentImageView.frame = CGRectMake(CGRectGetMinX(self.view.frame), CGRectGetMinY(self.tableView.frame), CGRectGetWidth(self.view.frame), (extractedImage.size.height/extractedImage.size.width) * CGRectGetWidth(self.view.frame)); 
     self.tableView.tableHeaderView = self.documentImageView; 
     [self.tableView setContentOffset: CGPointZero animated: YES]; 
     CGRect frame = self.documentImageView.frame; 
     frame.size.height = self.documentImageView.frame.size.height + 100; 
     self.tableView.frame = CGRectMake(0, 0, 200, 200); 
     self.tableView.tableHeaderView.frame = frame; 
    } 
} 

ответ

1

Вы можете использовать UIGestureRecognizerDelegate для acheve это.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
     shouldReceiveTouch:(UITouch *)touch 

Метод выше просит делегата, если распознаватель жестов должен получить объект, представляющий касание. Таким образом, вы можете проверить местоположение касания и вернуть NO, если его нет в нужном месте.

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