手势识别器在两个视图UIView和UIImageView上出现问题

3
我正在尝试在UIImageView上应用手势,当我给手势设置动作时,图像视图中的缩放、旋转和移动都可以工作。因此,我可以看到图像从一个点旋转、缩放并移动到另一个点。
当我将图像缩小并将缩放级别设置为最小值时,触摸UIView(UIImageView的超类)时也给出了手势操作。如何限制仅在UIImageView而不是UIView上有效的手势操作?并且正在尝试将其限制在UIVIew内,以使Imageview不会超出视图之外。
-(void)InitGestures{



    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
    tapRecognizer.numberOfTouchesRequired = 1;
    templatePhotoPlaceholderView=[[UIView alloc]init]; 
    templatePhotoPlaceholderView.clipsToBounds = YES;


    //templatephotoplaceholder frame setting
    [self templatePhotoPlaceholderFrameSetting];

    templatePhotoPlaceholderView.backgroundColor=[UIColor colorWithRed:0.8823 green:0.8823 blue:0.8823 alpha:1];
    [self photoView:templatePhotoPlaceholderView];

    tapRecognizer.view.frame=templatePhotoPlaceholderView.frame;
    [self photoButtonPlaceHolder:templatePhotoPlaceholderView];

    [selectedTemplateImage addSubview:templatePhotoPlaceholderView];
    [templatePhotoPlaceholderView addGestureRecognizer:tapRecognizer];



    UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)];
    [panRecognizer setMinimumNumberOfTouches:1];

    [panRecognizer setMaximumNumberOfTouches:1];
    [panRecognizer setDelegate:self];
    [templatePhotoPlaceholderView addGestureRecognizer:panRecognizer];
    //[panRecognizer release];


    UIPinchGestureRecognizer *pinchRecognizer = [[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scale:)] autorelease];
    [pinchRecognizer setDelegate:self];
    [self.view addGestureRecognizer:pinchRecognizer];
    //[pinchRecognizer release];

    [self.view addSubview:templatePhotoPlaceholderView];
    [tapRecognizer release];

}


-(void)move:(UIPanGestureRecognizer *)gestureRecognizer
{
    CGPoint translatedPoint = [gestureRecognizer translationInView:templatePhotoPlaceholderView];

    if([gestureRecognizer state] == UIGestureRecognizerStateBegan) {
        _firstX = [imageview center].x;
        _firstY = [imageview center].y;
    }



    translatedPoint = CGPointMake(_firstX+translatedPoint.x, _firstY+translatedPoint.y);

    [imageview setCenter:translatedPoint];  

}

有没有人知道如何限制移动图像在指定的范围内? - user905582
只需限制您的父视图框架即可。 - kiran
2个回答

1
首先在UIView中添加UIImageView,并为每个UIView应用手势,然后更改UIImageView的图像。这样看起来就像旋转了。我附上以下代码,请尝试一下。此示例适用于水平方向的3个UIView。
  -(void)addSwipeEvent:(UIView*)subView{

        UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(SwipeRecognizer:)];
        recognizer.numberOfTouchesRequired = 1;
        recognizer.delegate = self;
        [subView addGestureRecognizer:recognizer];
        [recognizer release];

        UISwipeGestureRecognizer *leftRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(SwipeRecognizer:)];
        leftRecognizer.direction=UISwipeGestureRecognizerDirectionLeft;
        leftRecognizer.numberOfTouchesRequired = 1;
        recognizer.delegate = self;
        [subView addGestureRecognizer:leftRecognizer];
        [leftRecognizer release];

        UISwipeGestureRecognizer *downRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(SwipeRecognizer:)];
        downRecognizer.direction=UISwipeGestureRecognizerDirectionDown;
        downRecognizer.numberOfTouchesRequired = 1;
        recognizer.delegate = self;
        [subView addGestureRecognizer:downRecognizer];
        [downRecognizer release];

        UISwipeGestureRecognizer *upRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(SwipeRecognizer:)];
        upRecognizer.direction=UISwipeGestureRecognizerDirectionUp;
        upRecognizer.numberOfTouchesRequired = 1;
        recognizer.delegate = self;
        [subView addGestureRecognizer:upRecognizer];
        [upRecognizer release];
    }

    - (void) SwipeRecognizer:(UISwipeGestureRecognizer *)sender {
        if ( sender.direction == UISwipeGestureRecognizerDirectionLeft ){
            NSLog(@" *** SWIPE LEFT ***");

        }
        if ( sender.direction == UISwipeGestureRecognizerDirectionRight ){
            NSLog(@" *** SWIPE RIGHT ***");

        }
        if ( sender.direction== UISwipeGestureRecognizerDirectionUp ){
            NSLog(@" *** SWIPE UP ***");

        }
        if ( sender.direction == UISwipeGestureRecognizerDirectionDown ){
            NSLog(@" *** SWIPE DOWN ***");

        }
    }

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
        if ([touch.view isKindOfClass:[UIView class]])
        {
            viewIndex = touch.view.tag;
            return YES;
        }
        return NO;
    }

    -(void)lowLevelSwipeRecognizer{

            CATransition *myTransition = [CATransition animation];
            myTransition.type = kCATransitionPush;
            myTransition.duration = 0.3;
            myTransition.subtype = kCATransitionFromRight;

                NSString *str = [arrayImg objectAtIndex:0];

                for (int i=0; i<2; i++) {
                    [arrayImg replaceObjectAtIndex:i withObject:[arrayImg objectAtIndex:i+1]];

                }
                [arrayImg replaceObjectAtIndex:2 withObject:str];


                for (int cnt = 0; cnt<3; cnt++) {
                    if ([[arrayView  objectAtIndex:cnt] isKindOfClass:[CustomView class]]) {
                        CustomView *v = (CustomView *)[arrayView  objectAtIndex:cnt];
                        [v.imageView setImage:[UIImage imageNamed:[arrayImg objectAtIndex:cnt]]];
                        [v.layer addAnimation:myTransition forKey:nil];
                    }
                }

    }

0
以下代码将限制移动图像在父视图边界内。
if (recognizer.state == UIGestureRecognizerStateBegan)
{
    previousPoint = [recognizer translationInView:self];
}
else if (recognizer.state == UIGestureRecognizerStateChanged)
{

    CGRect parentFrame = self.frame;
    CGRect currentFrame = imageView.frame;

    if (CGRectContainsRect(parentFrame, currentFrame)) 
    {
        CGPoint point = [recognizer translationInView:self.superview];
        CGPoint movePoint = CGPointMake(point.x - previousPoint.x, point.y - previousPoint.y);
        CGPoint newCenter = CGPointMake(imageView.center.x + movePoint.x, imageView.center.y + movePoint.y);
        imageView.center = newCenter;
        previousPoint = point;
    }
    else
    {
        CGRect imageRect = imageView.frame;
        if (imageRect.origin.x < 0)
            imageRect.origin.x = 0;
        else if (imageRect.origin.x + imageRect.size.width >= self.frame.size.width)
            imageRect.origin.x = self.frame.size.width - imageRect.size.width;

        if (imageRect.origin.y < 0)
            imageRect.origin.y = 0;
        else if (imageRect.origin.y + imageRect.size.height >= self.frame.size.height)
            imageRect.origin.y = self.frame.size.height - imageRect.size.height;

        imageView.frame = imageRect;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接