Проблема с распознавателем жестов в двух видах UIView и UIImageView

#iphone #objective-c #ipad

#iPhone #objective-c #iPad

Вопрос:

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

Когда я масштабировал изображение и уровень масштабирования до минимального и при нажатии на UIView, который является суперклассом для UIImageView, который также выполняет действие жеста. Как ограничить жест, который должен работать только в UIImageView, а не в UIView. и при попытке ограничить его внутри UIView просмотр изображения не должен выходить за пределы представления.

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

}
  

Комментарии:

1. У кого-нибудь есть идея, как ограничить движущееся изображение указанными границами.

2. просто ограничьте рамку вашего супервизора

Ответ №1:

Сначала вы добавляете UIImageView в UIView. и примените жест к каждому 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];
                    }
                }

    }
  

Ответ №2:

Следующий код ограничивает движущееся изображение в пределах супервизора

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