如何给出特定的手势识别器

时间:2015-11-19 14:18:49

标签: ios objective-c uigesturerecognizer uipangesturerecognizer uipinchgesturerecognizer

当我像这样应用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 个答案:

答案 0 :(得分:1)

您可以使用UIGestureRecognizerDelegate来实现此目的。

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

上述方法询问代表是否手势识别器应该接收表示触摸的对象。因此,您可以检查触摸位置,并在不在所需区域时返回NO