2012-05-24 2 views
1

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

Я имею UIScrollView, который имеет UIImageView. Изображение UIImageView должно изменяться с помощью правого и левого прокрутки. Я знаю, что переопределение штрихов UIScrollView не будет хорошим и эффективным решением, поэтому я добавил прозрачный вид на UIScrollView (а не как его подвью) покрывая границы UIScrollView и переопределяя его методы прикосновения, чтобы сменить изображения на салфетки.

Теперь со шлемом p pinch gesture recognizer, добавленный к моему прозрачному представлению Я могу увеличить изображение UIScrollView и изображение программно. До сих пор я умею хорошо работать, но у меня есть еще одна типичная функциональность. Мне нужно перемещать увеличенное изображение пальцем вверх и вниз, чтобы я мог видеть обрезанное изображение. Я делаю это с помощью UILongPressGestureRecognizer, добавленного в мой прозрачный вид. По истечении 1 секунды времени касания я добавляю UIImageView с четырехсторонним изображением стрелки и добавляю его касание. Теперь, когда я двигаю пальцем, fourwayarrow image следует пальцем, но изображение в прокрутке не следует за моим пальцем. Его вялый и часто работает, как будто я привязал эластичную нитку. Поэтому изначально мне приходится тянуть строку до некоторого порога (до этого момента вид прокрутки не перемещается), и когда он достигает этого уровня, он внезапно начинает выходить из-под контроля. Я добавляю здесь код для вас, чтобы посмотреть.

Пожалуйста, не стесняйтесь добавлять комментарии, если вам нужна какая-либо другая информация.

- (void) handleLongPress:(UILongPressGestureRecognizer *)longPressGestureRecognizer{ 
    CGPoint touchLocation = [longPressGestureRecognizer locationInView:self.transparentLayer]; 
    switch (longPressGestureRecognizer.state) { 
     case UIGestureRecognizerStatePossible: break; 
     case UIGestureRecognizerStateBegan:{ 
      if (fourWayArrowImageView == nil) { 
       fourWayArrowImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"4wayarrow.png"]]; 
       [fourWayArrowImageView setBackgroundColor:[UIColor clearColor]]; 
      } 
      _previousLocation.x = touchLocation.x; 
      _previousLocation.y = touchLocation.y; 
      [fourWayArrowImageView setCenter:touchLocation]; 
      [self.transparentLayer addSubview:fourWayArrowImageView]; 
     } 
      break; 
     case UIGestureRecognizerStateChanged:{ 
      float dx = (touchLocation.x - _previousLocation.x); 
      float dy = (touchLocation.y - _previousLocation.y); 
      CGPoint currentMaxOffset = [self currentMaxOffset]; 
      CGPoint currentOffset = [self.rotatableImageViewContainingScrollView contentOffset]; 
      float theScale = [self.rotatableImageViewContainingScrollView zoomScale]; 
      currentOffset.x -= (dx*theScale); 
      currentOffset.y -= (dy*theScale); 

      [fourWayArrowImageView setCenter:touchLocation]; 
      CGSize size = self.rotatableImageViewContainingScrollView.frame.size; 
      [self.rotatableImageViewContainingScrollView scrollRectToVisible:CGRectMake(currentOffset.x, currentOffset.y, size.width, size.height) animated:YES]; 
      _prevMaxOffset = CGPointMake(currentMaxOffset.x, currentMaxOffset.y); 
     } 
      break; 
     case UIGestureRecognizerStateCancelled: 
     case UIGestureRecognizerStateFailed: 
     case UIGestureRecognizerStateEnded: [fourWayArrowImageView removeFromSuperview]; break; 
    } 
} 

ответ

0

Обнаружено решение. На самом деле я ошибся. Я не обновлял предыдущее местоположение после прокрутки, и прокрутка не должна быть анимирована в этом случае. Поэтому, пожалуйста, посмотрите на ответ. BTW спасибо всем ребятам, которые дали время:

- (void) handleLongPress:(UILongPressGestureRecognizer *)longPressGestureRecognizer{ 
    CGPoint touchLocation = [longPressGestureRecognizer locationInView:self.transparentLayer]; 
    switch (longPressGestureRecognizer.state) { 
     case UIGestureRecognizerStatePossible: break; 
     case UIGestureRecognizerStateBegan:{ 
      if (fourWayArrowImageView == nil) { 
       fourWayArrowImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"4wayarrow.png"]]; 
       [fourWayArrowImageView setBackgroundColor:[UIColor clearColor]]; 
      } 
      _previousLocation = CGPointMake(touchLocation.x, touchLocation.y); 
      [fourWayArrowImageView setCenter:touchLocation]; 
      [self.transparentLayer addSubview:fourWayArrowImageView]; 
     } 
      break; 
     case UIGestureRecognizerStateChanged:{ 
      float dx = (touchLocation.x - _previousLocation.x); 
      float dy = (touchLocation.y - _previousLocation.y); 
      CGPoint currentMaxOffset = [self currentMaxOffset]; 
      CGPoint currentOffset = [self.rotatableImageViewContainingScrollView contentOffset]; 
      //float theScale = [self.rotatableImageViewContainingScrollView zoomScale]; 
      //currentOffset.x -= (dx*theScale); 
      //currentOffset.y -= (dy*theScale); 
      currentOffset.x -= (dx); 
      currentOffset.y -= (dy); 
      [fourWayArrowImageView setCenter:touchLocation]; 
      CGSize size = self.rotatableImageViewContainingScrollView.frame.size; 
      [self.rotatableImageViewContainingScrollView scrollRectToVisible:CGRectMake(currentOffset.x, currentOffset.y, size.width, size.height) animated:NO]; //bool value in animated should be false. 
      _prevMaxOffset = CGPointMake(currentMaxOffset.x, currentMaxOffset.y); 
      _previousLocation = CGPointMake(touchLocation.x, touchLocation.y); // added this line in the answer. 
     } 
      break; 
     case UIGestureRecognizerStateCancelled: 
     case UIGestureRecognizerStateFailed: 
     case UIGestureRecognizerStateEnded: [fourWayArrowImageView removeFromSuperview]; break; 
    } 
} 

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

Надеюсь, это поможет

+0

Вы делаете это по-настоящему круговым путем. Вы должны взглянуть на образец кода Apple PhotoScroller. Вы можете использовать прокрутку пейджинга и использовать стандартную поддержку масштабирования/панорамирования, встроенную в UIScrollView. Вам не нужно делать всю эту работу самостоятельно. –

+0

@MikeWeller Спасибо, Майк .. Но у меня есть требование клиента выполнять повороты с помощью салфетки на любом уровне масштабирования .. это невозможно сделать с помощью масштабирования и прокрутки по умолчанию для прокрутки, поскольку вы не можете прокручивать его, когда он масштабируется. Поэтому я должен был так поступать так –

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