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;
}