0

When I apply panDetected like this, the image is moving everywhere on the screen. I just want this feature to at the top in specific rectangle. What should I change?

-(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];
}

And this one is just allowing me to zoom on the pic but only from middle point not every point on the pic.

-(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;
    }
}
Berendschot
  • 3,026
  • 1
  • 21
  • 43

1 Answers1

1

You can use UIGestureRecognizerDelegate to acheve this.

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

The method above asks the delegate if a gesture recognizer should receive an object representing a touch. Therefore, you can check touch location and return NO when its not in the desired area.

Rafał Sroka
  • 39,540
  • 23
  • 113
  • 143