UIScrollview лимит области прокрутки

Я пытаюсь ограничить область прокрутки 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 ответа

Решение

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

Другие ответы не сработали для меня. Наследование 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
    }
}

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

// 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;
}
Другие вопросы по тегам