У меня есть галерея изображений, если пользователь один раз коснется изображения, оно появится в полноэкранном режиме 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;
}