Обработка/обнаружение UIPanGestureRecognisor и UISwipeGestureRecognisor в одном и том же UIImageView

У меня есть галерея изображений, если пользователь один раз коснется изображения, оно появится в полноэкранном режиме ImageView,

Теперь, если пользователь использует UIPinchGesture, изображение идеально увеличивается/уменьшается.

Я хочу добиться, если изображение не увеличено. UISwipeGesture Должен работать, и при жесте смахивания вызывается следующее изображение из галереи.

если изображение увеличено, то swipeGesture перестанет работать, и UIPanGesture должен работать.

каков наилучший подход для его достижения,

я делаю это так. но всегда смешивая PanGesture и SwipeGesture.

мой метод обработки свайпа

- (void)handleSwipe:(UIGestureRecognizer *)sender
{
    if (stopSwipe == true) // bool iVar (stopSwipe)
    {
        return;
    }
    UISwipeGestureRecognizerDirection direction = [(UISwipeGestureRecognizer *) sender direction];
    switch (direction)
    {
        case UISwipeGestureRecognizerDirectionLeft:
            newIndexPath = [NSIndexPath indexPathForRow:myIndexPath.row+1 inSection:myIndexPath.section];
            [self ChangeImage];
            myIndexPath = [NSIndexPath indexPathForRow:myIndexPath.row+1 inSection:myIndexPath.section];
            break;
        case UISwipeGestureRecognizerDirectionRight:
            newIndexPath = [NSIndexPath indexPathForRow:myIndexPath.row-1 inSection:myIndexPath.section];
            [self ChangeImage];
            myIndexPath = [NSIndexPath indexPathForRow:myIndexPath.row-1 inSection:myIndexPath.section];
            break;
        default:
            break;
    }
}

мой метод обработки защемления

-(void)handlePinch:(UIPinchGestureRecognizer*)sender
{
static CGRect initialBounds;
if (sender.state == UIGestureRecognizerStateBegan)
{
    initialBounds = myLrgImageView.bounds;
}
CGFloat factor = [(UIPinchGestureRecognizer *)sender scale];

CGAffineTransform transform = CGAffineTransformScale(CGAffineTransformIdentity, factor, factor);
myLrgImageView.bounds = CGRectApplyAffineTransform(initialBounds, transform);
}

мой метод управления панорамированием

-(void)handlePan:(UIPanGestureRecognizer*)recognizer
{
    //after pinch 'myLrgImageView.frame' is changed.
    //imgActualBoundry is the normal size with out zooming.
    if ([NSValue valueWithCGRect:myLrgImageView.frame] > [NSValue valueWithCGRect:imgActualBoundry])
    {
        stopSwipe = true;
        CGPoint translation = [recognizer translationInView:self.myLrgImageView];
        recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
                                         recognizer.view.center.y + translation.y);
       [recognizer setTranslation:CGPointMake(0, 0) inView:self.myLrgImageView];

       if (recognizer.state == UIGestureRecognizerStateEnded)
       {
           CGPoint velocity = [recognizer velocityInView:self.myLrgImageView];
           CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y));
           CGFloat slideMult = magnitude / 200;
           NSLog(@"magnitude: %f, slideMult: %f", magnitude, slideMult);

           float slideFactor = 0.1 * slideMult; // Increase for more of a slide
           CGPoint finalPoint = CGPointMake(recognizer.view.center.x + (velocity.x * slideFactor),
                                         recognizer.view.center.y + (velocity.y * slideFactor));
           finalPoint.x = MIN(MAX(finalPoint.x, 0), self.myLrgImageView.bounds.size.width);
           finalPoint.y = MIN(MAX(finalPoint.y, 0), self.myLrgImageView.bounds.size.height);
        }
    }
    else
    {
        stopSwipe = false;
    }
}

я пробовал с этим методом одновременного использования нескольких жестов или без него, но не добился успеха.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}

person M Zubair Shamshad    schedule 15.07.2014    source источник
comment
Вы установили делегата для обоих распознавателей? в противном случае метод «shouldRecognizeSimultaneeous» никогда не вызывается   -  person CodingMeSwiftly    schedule 15.07.2014
comment
@Cabus да, я установил этих делегатов   -  person M Zubair Shamshad    schedule 15.07.2014


Ответы (1)


Что я понял из вашего вопроса: вы хотите использовать жесты Pan и Swipe на одном и том же UIImageView, но при определенных условиях.

Если я говорю, что я просто ленивый человек, просто сначала возьмите фактический размер изображения в iVar, затем проверьте оба метода делегата:

if size is changed then you will surely like to use Pan gesture on same Image.
&
if size is the same as actual image then Swipe. 

Я просто публикую как идею, чтобы продолжить вас.

Извините за публикацию не кода, на самом деле столкнулись с нехваткой электроэнергии, а батарея ноутбука вот-вот разрядится. :П

person Community    schedule 08.12.2014
comment
Ваша идея хороша и достаточна для понимания. Я уже решил эту проблему, как вы мне предлагаете. и приятно видеть вас на этом посту после долгого времени. Спасибо - person M Zubair Shamshad; 08.12.2014
comment
и я принимаю этот ответ, потому что я тоже использовал ваш трюк. но самое смешное перед вашим предложением. :П ;) - person M Zubair Shamshad; 08.12.2014
comment
Если вы найдете решение любого из ваших вопросов / проблем, вы также можете добавить ответ на него. Неплохо ответить на свой вопрос, если есть решение. - person ; 08.12.2014