UIScrollview лимит области прокрутки - PullRequest
9 голосов
/ 05 декабря 2011

Я пытаюсь ограничить область прокрутки UIScrollview, но я не могу этого сделать.

Я хотел бы установить область перелистывания только в верхней части UIScrollview, но я хотел быустановить все содержимое видимым.

Обновление:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    if ([touches count] > 0) {
        UITouch *tempTouch = [touches anyObject];
        CGPoint touchLocation = [tempTouch locationInView:self.categoryScrollView];
        if (touchLocation.y > 280.0)
        {
            NSLog(@"enabled");
            self.categoryScrollView.scrollEnabled = YES;
        }
    }
    [self.categoryScrollView touchesBegan:touches withEvent:event];
}

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
//    [super touchesEnded:touches withEvent:event];
    self.categoryScrollView.scrollEnabled = YES;
    [self.categoryScrollView touchesBegan:touches withEvent:event];
}

Решение: не забудьте установить delaysContentTouches в NO на UIScrollView

self.categoryScrollView.delaysContentTouches = NO;

Ответы [ 3 ]

7 голосов
/ 05 декабря 2011

Вы можете отключить прокрутку на UIScrollView, переопределить touchesBegan:withEvent: в вашем контроллере вида, проверить, не начались ли какие-либо касания в той области, где вы хотите включить прокрутки, и если ответ «да», повторно включите прокрутку. Также переопределите touchesEnded:withEvent: и touchesCancelled:withEvent:, чтобы отключить прокрутку, когда касания закончились.

6 голосов
/ 15 января 2017

Другие ответы не сработали для меня.Подклассы UIScrollView работали для меня (Swift 3):

class ScrollViewWithLimitedPan : UIScrollView {
    // MARK: - UIPanGestureRecognizer Delegate Method Override -
    override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        let locationInView = gestureRecognizer.location(in: self)
        print("where are we \(locationInView.y)")
        return locationInView.y > 400
    }
}
4 голосов
/ 26 мая 2014

Это сообщение в блоге демонстрирует очень простой и понятный способ реализации функциональности.

// init or viewDidLoad

  UIScrollView *scrollView = (UIScrollView *)view;
  _scrollViewPanGestureRecognzier = [[UIPanGestureRecognizer alloc] init];
  _scrollViewPanGestureRecognzier.delegate = self;
  [scrollView addGestureRecognizer:_scrollViewPanGestureRecognzier];

//

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

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
  if (gestureRecognizer == _scrollViewPanGestureRecognzier)
  {
    CGPoint locationInView = [gestureRecognizer locationInView:self.view];
    if (locationInView.y > SOME_VALUE)
    {
      return YES;
    }
    return NO;
  }
  return NO;
}
...