GestureRecognizer проблема с двумя представлениями UIView и UIImageView - PullRequest
3 голосов
/ 13 ноября 2011

Я пытаюсь применить жест к 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];  

}

Ответы [ 2 ]

1 голос
/ 14 марта 2012

Сначала вы добавляете 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];
                    }
                }

    }
0 голосов
/ 18 декабря 2011

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

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...