2013-04-06 2 views
3

Если кто-нибудь наткнулся на приложение google maps для iOS, есть большая возможность увеличить/уменьшить одним пальцем: Doubletap на экране uiscrollview, а затем сразу же сдвиньте палец вверх или вниз, вниз для увеличения/уменьшения. Кто-нибудь знает, как это достигается? Был ли Google опубликован любой фрагмент?Doubletap и слайд/перетаскивание пальца для увеличения/уменьшения

+0

Никто не сталкивался с этим ??? –

+0

Кажется, никто)) Отличная возможность стать первой! – faviomob

+0

да! Какая радость .... –

ответ

3

Я добавил эту функциональность в my UIScrollView category.
Фактическое распознавание контактов легко, рассчитывая «правильное» (что бы ни было «правильно») zoomScale является проблемой ... Если вы считаете, что категория не справляется с этим достаточно хорошо, пожалуйста, не стесняйтесь говорить мне и открывать новый выпуск на странице github.

0

В этом примере используются регулярные возможности масштабирования UIScrollView, который содержит UIImageView в качестве подзадачи. Вы можете найти реализацию такого масштабирования в библиотеке MWPhotoBrowser, например. _imageView, _doubleTapBeganPoint, _longPressBeganPoint, _minScale - это ваш класс (подкласс UIScrollView) iVars. Так начинается с инициализации:

UILongPressGestureRecognizer* lpgs = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(imageLongPressed:)]; 
lpgs.minimumPressDuration = .2; 
[self addGestureRecognizer:lpgs]; 

Стандартный зум обработчика:

- (UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView { 
    return _imageView; 
} 

Использование touchesBegan поймать двойное нажатие (UITapGestureRecognizer не хочет работать с UILongPressGestureRecognizer в какой-то причине):

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    UITouch *touch = [touches anyObject]; 
    NSUInteger tapCount = touch.tapCount; 
    switch (tapCount) { 
     case 2: 
      [self handleDoubleTapBegan:[touch locationInView:self.superview]]; 
      break; 
     default: 
      break; 
    } 
    [[self nextResponder] touchesEnded:touches withEvent:event]; 
} 

- (void)handleDoubleTapBegan:(CGPoint)touchPoint { 

    _doubleTapBeganPoint = touchPoint; 

    NSLog(@"image double tap began at location: %@", NSStringFromCGPoint(touchPoint)); 
} 

Длительное нажатие и использование разницы в координатах Y для расчета масштаба масштабирования. _minScale хранит ваш первоначальный масштаб масштабирования, поэтому мы можем его восстановить.

- (void) imageLongPressed:(UIGestureRecognizer*)gesture { 

    if (gesture.state == UIGestureRecognizerStateBegan) 
    { 
     self.maximumZoomScale = _maxScale * 2; 
     self.minimumZoomScale = _minScale/3; 

     _longPressBeganPoint = [gesture locationInView:self.superview]; 

     [self setZoomScale:_minScale animated:YES]; 
     NSLog(@"image long press began at location: %@", NSStringFromCGPoint(_longPressBeganPoint)); 
    } 
    else if (gesture.state == UIGestureRecognizerStateChanged) 
    { 
     CGPoint p = [gesture locationInView:self.superview]; 

     //NSLog(@"image long press changed at location: %@", NSStringFromCGPoint(p)); 

     if (CGPointEqualToPoint(_longPressBeganPoint, _doubleTapBeganPoint)) 
     { 
      _zoom = _minScale + (p.y - _longPressBeganPoint.y)/100.0; 

      NSLog(@"zoom scale: %f", _zoom); 

      [self setZoomScale:_zoom animated:NO]; 
     } 
    } 
    else if (gesture.state == UIGestureRecognizerStateEnded) 
    { 
     NSLog(@"image long press ended at location: %@", NSStringFromCGPoint([gesture locationInView:gesture.view])); 

     if (self.zoomScale < _minScale) 
     { 
      [self setZoomScale:_minScale animated:YES]; 
      NSLog(@"min zoom scale: %f", _minScale); 
     } 
    } 
} 
0

Используйте UIPanGestureRecognizer для отслеживания перетаскивания вверх/вниз. Чтобы убедиться, что он только получает срабатывает на двойное нажатие, дать ему делегат, который выполняет следующие действия:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool { 
    if gestureRecognizer == yourZoomRecognizer { 
     return touch.tapCount == 2 
    } else { 
     return true 
    } 
} 

Теперь обрабатывать сообщения, поступающие от жеста распознавани. Вы можете вывести значение масштаба, как так:

let zoomFactor: CGFloat = 1.01  //Each point of pan zooms in or out by this much 
var zoomScale: CGFloat = 1   //Dummy variable for example purposes. 

@IBAction func handleZoomGesture(sender: UIPanGestureRecognizer) { 
    if sender.state == .began { 
     //Set initial translation to reflect the current zoomScale 
     let logZoom = log(zoomScale)/log(zoomFactor) 
     sender.setTranslation(CGPoint(x: 0, y: logZoom), in: sender.view) 
    } else if sender.state == .changed { 
     let logZoom = sender.translation(in: sender.view).y 
     zoomScale = pow(zoomFactor, logZoom) 
    } 
} 

Это не показывает на самом деле установка zoomScale на Scrollview, что связка дополнительного кода - вы хотите, чтобы получить расположение и центр на сковороду жеста в обведите вокруг этого. Вы также захотите зажать zoomScale и, возможно, справиться с завершением масштабирования.

Смежные вопросы